Portál AbcLinuxu, 6. května 2025 20:26
Dejme tomu, že podle utc je čas zimníTo je nesmysl, UTC je konkrétní časové pásmo, takže žádný zimní nebo letní čas nerozlišuje. „Zimní“ nebo letní čas znamená, že se pro danou geografickou oblast při neuvedení časového pásma myslí po část roku jedno pásmo (např. CET) a po jinou část roku jiné časové pásmo (např. CEST). MySQL při přepočtu používá aktuální časovou zónu (serveru nebo spojení), což je pro uživatele špatně – ten očekává zobrazení v časové zóně platné pro zadané datum, ne pro aktuální (když dnes naplánuju štědrovečerní večeři na 18:00, myslím tím 18:00 SEČ, i když dnes platí SELČ). Jak už jsem psal, převádějte to podle časové zóny platné pro uživatelem zadaný datum a čas – přičemž pro tu jednu hodinu v říjnu se musíte uživatele buď zeptat, jaké časové pásmo myslel, nebo některé vybrat automaticky (s tím, že pak uživatel nebude moci zadat časový údaj v rámci té jedné hodiny v roce).
DateTime
, ne v nastavení systému (já jsem váš komentář původně pochopil druhým způsobem). Jak se to chová v té přelomové hodině, např. 30.10.2011 2:30:00? Nemám teď nikde PHP5, abych si to mohl vyzkoušet…
Format(DateTime::ISO8601); echo '
'; $v='30.10.2011 1:59:59'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo '
'; $v='30.10.2011 2:00:01'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo '
'; $v='30.10.2011 2:10:00'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo '
';
30.10.2011 1:50:00 => 2011-10-30T01:50:00+0200 30.10.2011 1:59:59 => 2011-10-30T01:59:59+0200 30.10.2011 2:00:01 => 2011-10-30T02:00:01+0100 30.10.2011 2:10:00 => 2011-10-30T02:10:00+0100PS: Default časová zóna se v PHP nastavuje explicitně v php.ini a pokud není, nebo je třeba ji změnit, tak se přestaví pomocí fce
date_default_timezone_set()
<?php date_default_timezone_set('Europe/Prague'); $v='30.10.2011 1:50:00'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo "<br />\n"; $v='30.10.2011 1:59:59'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo "<br />\n"; $v='30.10.2011 2:00:01'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo "<br />\n"; $v='30.10.2011 2:10:00'; $d = new DateTime($v); echo "$v => " . $d->Format(DateTime::ISO8601); echo "<br />\n";
Lokální časová zóna systému se týká aktuálního data a času. Když ji použijete i pro údaje v minulosti a budoucnosti, bude se počítat špatně – když si dnes zadám do kalendáře připomínku na půlnoční přípitek 31. prosince, myslím tím půlnoc SEČ, ne SELČ.Tohle dělá problém jen když máte v systému natvrdo SEČ (+0100) a pak to jednou v neděli magicky přenastavíte na +0200 (viz známé "systém windows přenastavil..."). Aby se to počítalo správně bez ohledu na to kolik je _teď_ a jak se počítá letní čas _letos_, tak se používají plovoucí časové zóny typu Europe/Prague, kde jsou všechny tyhle věci zakódovány a počítá se to správně. Co se týče hlavního dotazu, tak bych v tom nehledal vědu a určitě bych se to nesnažil dělat ručně - stačí použít právě nějakou systémovou funkci s příslušným časovým pásmem. To může být buď natvrdo ČR, nebo se můžete uživatele zeptat v jaké oblasti se zrovna nachází.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.