(PHP) den nemá 86 400 sekund?
Víte kolik má den sekund? Občas jsem viděl v PHP toto počítat jako 24 (hodin) * 60 (minut) * 60 (sekund). Nefunguje to.
setlocale(LC_ALL, "czech"); date_default_timezone_set("Europe/Paris"); function p($t) { $d = getdate( $t ); echo $d['mday'],' '; } $o = 24*60*60; // 86 400 $t = mktime(0,0,0,10,29,2011); p($t); for ($i = 1; $i<=4; $i++) { $t += $o; p($t); }
Vypíše:
29 30 30 31 1
Jistě, při posunu času (letní/zimní) je den o 1 hodinu kratší (delší).
[1] ano, zimní čas. Aneb (každý) den nemá 86 400 sekund.
Tak přesně na toto jsem narazil když jsem loni koncem října programoval rezervační kalendář.
Tak zrovna tenhle případ jednoduše vyřeší místo mktime použití gmmktime
[4] samozřejmě, počítat mktime s offsetem +1 den je správný postup, počítat +86 400 sekund není.
Jeden z důvodů proč mám raději ASP.NET než PHP
[6] PHP se zde chová dobře, právěže pracuje správně s letním / zimním časem
A kam patří vteřina na rozhraní dne? ;)
Kam patří hranice, při rozdělení pizzy na třetiny?
1/3 + 1/3 + 1/3 = 1
0.333.. + 0.333.. + 0.333.. = 0.999..
Což je o 0.00...01 méně.
Zkusil bych počítat třeba od poledne.
Problém je, že den opravdu nemá 86400 sekund, a konkrétně některé minuty mohou mít 61 sekund (měla by to být "common knowledge" a je to skoro ve všech dokumentacích funkci pracujících s čase - popsáno jako "leap seconds"). Zádrhelem je, že čas v sekundách od roku 1980 má leap seconds řešeny tak, že ty vteřiny trvají 2x déle, zatímco ostatní časové údaje mají o jednu vteřinu navíc (oněch 61 vteřin v minutě).
Pokud někdo potřebuje přičíst jeden den/měsíc/cokoliv, pak doporučuji tento PŘEHLEDNÝ postup, u kterého snad není pochyb, co znamenají a jak fungují tyto 2 zápisy s rozdílným výsledkem:
date('Y-m-d', strtotime("2010-02-25 +1 month"));
date('Y-m-d', strtotime("2010-02-25 +31 days"));
[8] Takove technicke doplneni. Neni to o 0.00...01 mene. 0.999...=1.0.
[6] V ASP.NET má snad každý den 86 400 sekund? Tohle přece nijak nesouvisí s konkrétním programovacím jazykem.