Jak na časové zóny v PHP + MySQL?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Hellish
Člen | 16
+
0
-

Ahoj,

v mojí aplikaci si uživatel nastaví, že se určitá akce má odehrát v určitý den a čas. Uživatelé jsou z různých časových pásem a já řeším, jak se s tím nejlépe poprat. Určitě nejsem první, kdo tohle řeší, ale žádnou kloudnou odpověď jsem nevygooglil, tak se ptám zde.

Jde o to, jak tuto informaci ukládat v MySQL. Ideální by bylo uložit DATETIME s časovou zónou tak, aby s tím uměl pracovat v SELECtech, ale nic takového MySQL neumí (nebo jsem na to nepřišel). Takže ukládám datum jako string a vedle toho si k uživatelovi ukládám časovou zónu. Nicméně pokaždé, když chci zjistit, jestli se nemá vykonat nějaká akce, tak musím vše dostat do PHP, kde datumy vygeneruju na základě uživatelova časového pásma a porovnám s aktuálním časem. Ale tahat pořád všechno do PHP není ideální.

Napadlo mne uložit si do MySQL vedle časový zóny i časový offset vůči UTC a stím kalkulovat v SELECTech. Tím by se to vyřešilo, akorát kvůli letním časům se tento offset může měnit, takže bych musel zajistit, že se bude správně aktualizovat.

Jak byste to řešili vy? Je tu nějaké přímočaré řešení, který nevidím? Díky!

UPDATE: Ha, tak jsem objevil MySQL funkci CONVERT_TZ, která to pravděpodobně řeší. Akorát jsem nepřišel na to, jak tento dotaz z fóra smazat :)

UPDATE 2: Ha, tak rozběhat CONVERT_TZ není úplně triviální, takže opět hledám nějaké přímočařejší řešení.

Editoval Hellish (11. 8. 2015 16:48)

Jan Tvrdík
Nette guru | 2595
+
+8
-

Řešíš to nějak složitě. V aplikaci a v databázi pracuj interně pouze z UTC zónu. Data od uživatele tedy hned po přijetí překonvertuj do UTC a do jeho lokální zóny konvertuj zase až na výstupu.

Pavel Kravčík
Člen | 1196
+
-5
-
  1. Proč mazat? Napiš řešení, pokud to bude hledat někdo další.
  2. Jak to souvisí s Nette?
  3. Tak Ti to stejně smaže admin.
  4. Profit???
Hellish
Člen | 16
+
0
-

Převádět vše do UTC mně také napadlo. Jen bych musel všechny časy přepočítat, pokud by si uživatel v nastavení změnil časovou zónu. Na druhou stranu uživatelé časové zóny běžně nemění, takže to není zas tak velký problém.

Hellish
Člen | 16
+
0
-
  1. Pravda
  2. Aplikace je v Nette. A možná má pro tuto situaci Nette nějaký „udělátko“. Nevím, proto se ptám :)
Jan Tvrdík
Nette guru | 2595
+
0
-

Jen bych musel všechny časy přepočítat, pokud by si uživatel v nastavení změnil časovou zónu

Ty přepočítáváš data pouze na vstupu od uživatele a na výstupu pro uživatele (vzhledem k aktuální časové zóně uživatele), interně máš všechno v UTC. Změna časové zóny uživatele si nevyžádá žádné přepočítání navíc.

Hellish
Člen | 16
+
0
-

Změna časové zóny uživatele si nevyžádá žádné přepočítání navíc.

Uživatel si nastaví, že se akce má provést v 12:00. Pak si v nastavení všimne, že má špatně nastavenou časovou zónu a opraví to. Nicméně pořád chce, aby se akce provedla ve 12:00. Pokud bych to nepřepočítal, provedla by se někdy jindy (v závislosti na nově nastavené časové zóně) což by bylo matoucí.