Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 25. 5. 2018, 21:15:47
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 |
#2 · Zasláno: 26. 5. 2018, 01:48:17
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 |
#3 · Zasláno: 26. 5. 2018, 08:14:02
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. |
||
Časová prodleva: 6 let
|
0