Autor Zpráva
Kcko
Profil
Ahoj, php.net/manual/en/datetime.modify.php #example2
Když se operuje s měsíci, může to vést k neočekávánému výstupu (viz ten příklad).

Našel jsem si fix viz gist.github.com/Kcko/8cb9a234c819f9de2ad77f32ab80e4d7 nicméně, máte s tím někdo zkušenosti, jak to řešíte, jak jste obešli problém, víte o tom vůbec?
Keeehi
Profil
Kcko:
To se nedá nazývat bugem. Je to jen důsledek toho, že v různých kontextech může slovo měsíc znamenat 28-31 dní. Takže je potřeba vybrat nějaký způsob, jak slovo měsíc převést na počet dní. A nějaký byl vybrán a použit. A pokud se ti to nelíbí můžeš přece vždy použít jen '+X days' a dosadit tam číslo, které zrovna v tvém kontextu znamená slovo měsíc.
To samé se týká i slova rok který má 365 nebo 366 dní (většinou).
No a díky letnímu a zimnímu času má den 23-25 hodin. Takže se ti může stát že když budeš mít datum 2018-03-24 2:30:00 a budeš chtít +1 day tak ti z toho vyleze asi 2018-03-25 3:30:00 protože 25. 3. 2018 druhá hodina ranní v České republice neexistuje. Legrace je, letní a zimní čas se v různých státech mění v různé dny a také v jednom státě v různé roky.
Dále tu máme kvůli zpomalování rotace země občas přestupnou vteřinu. Práce s datem, časem a intervaly není nic jednoduchého a směr kam "zaokrouhlit" neplatné hodnoty se řídí vždy požadavky dané aplikace.
Kcko
Profil
Ahoj Keeehi, díky za pěkný rozbor.

Dosadit + 30 dní taky nebude v nějakých případech dávat přesné

viz

$d = ['2018-01-29', '2018-01-30'];


foreach ($d as $day)
{
    $dt = new DateTime($day);
    echo $dt->add(new DateInterval('P30D'))->format('Y-m-d');
}


vs

$d = ['2018-01-29', '2018-01-30'];


foreach ($d as $day)
{
    $dt = new DateTime($day);
    echo $dt->add(new DateInterval('P1M'))->format('Y-m-d');
}

Potřeboval sem trošku jiné chování, ale ted vidím, že nepoužiju ani tu třídu z Gistu a budu akorát kontrolovat jestli se mi změnil měsíc jen +1 nebo –1 a hlavně DEN zůstal stejný, pokud ne, tak vůbec skript nevykonám.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0