Jak na časové zóny v PHP + MySQL?
- Hellish
- Člen | 16
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
Ř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
- Proč mazat? Napiš řešení, pokud to bude hledat někdo další.
- Jak to souvisí s Nette?
- Tak Ti to stejně smaže admin.
- Profit???
- Jan Tvrdík
- Nette guru | 2595
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
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í.