Portál AbcLinuxu, 7. května 2025 08:00
Řešení dotazu:
timestamp
se vždy ukládá v UTC a převádí se do aktuální časové zóny. Začal bych tedy tím, že se podíváte pomocí mysql
klienta do databáze, zda tam ty časy máte správně a zda se správně převádí, když nastavíte různé časové zóny. Druhá věc je pak ještě zkontrolovat, jak se to chová v PHP, zda vám to náhodou nepřevádí mezi časovými zónami ještě podruhé.
13:00 TZ+2:00 == 12:00 TZ+1:00 == 11:00 UTC
, žádné přičítání nebo odčítání není potřeba. Akorát je potřeba počítat s tím, že uživatel očekává časovou zónu platnou v době zadávaného času, ne aktuální – takže je potřeba časovou zónu přepínat podle zadávaného/čteného data, ne podle aktuálního data. Tj. pokud zadávám nebo čtu datum a čas v prosinci, musím nastavit časovou zónu SEČ, bez ohledu na to, zda je zrovna aktuální SEČ nebo SELČ. Při zadávání času mezi 2:00 a 3:00 při přechodu z letního času na standardní je asi potřeba se uživatele na časové pásmo dotázat, protože to nijak nevyvěštíte.
Akorát je potřeba počítat s tím, že uživatel očekává časovou zónu platnou v době zadávaného času, ne aktuální – takže je potřeba časovou zónu přepínat podle zadávaného/čteného data, ne podle aktuálního data.Jo, o to mi právě šlo. Jestli MySQL má tohle už nějak vyřešené, pak není co řešit. Z dotazu jsem nabyl dojmu, že si to přepočítávání píše sám.
Asi každý myslíme něco jiného časovou zónou.
Očividně. Ale pokud se v souvislosti s unixovými systémy používá termín timezone (časová zóna), myslí se tím téměř vždy to, o čem mluvím já.
pořád tam zbývá ta hodina při přechodu zpět na sluneční čas, kdy datum, čas a geografická časová zóna nestačí.
Proto se také jako interní reprezentace používá ta vyjádřená pomocí time_t
, která tímto problémem netrpí. A proto funkce mktime()
v tom jednom speciálním případě přihlíží i k hodnotě položky tm_isdst
; protože ale tento speciální případ (u většiny zón - z těch, které vůbec nějaký letní čas mají) pokrývá přibližně jednu setinu procenta roku (navíc pečlivě vybranou tak, aby se toho dělo pokud možno co nejméně), nikdo to obvykle moc neřeší.
mktime()
a localtime()
resp. localtime_r()
se o to postarají, otázkou jen je, jestli je autor software použije nebo jestli se spolehne na lidovou tvořivost.
SET time_zone='Europe/Prague'
Potom to funguje dobře.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.