W związku z ostatnią zmianą czasu na letni, chciałem napisać trochę o skutkach tego postępowania. Nie zamierzam tu dyskutować o wpływie na zużycie energii, bo nie mam na ten temat żadnych wiarygodnych danych. Pominę też aspekt przystosowania przez organizm. Mnie to zajmie na tyle długo, bym tego nie lubił. Chcę się za to skupić na aspekcie przechowywania danych daty i czasu w bazie danych i użycie jej w skryptach.
Podstawowym pytaniem jest: co musimy zapisać w bazie danych, by mieć wystarczającą ilość danych do późniejszych przeliczeń. Jak można domyśleć się po wstępie, sam znacznik czasu (lub dokładna data i godzina) to za mało. Nie wystarczy też stosowany czasem system zapisu znacznika czasu razem z przesunięciem czasowym względem „ZULU” – czasu środkowo-europejskiego. Teoretycznie wszystko gra – mamy informację o czasie lokalnym użytkownika, oraz jak go przeliczyć na czas lokalny innego użytkownika. Do większości zastosowań jest to zupełnie wystarczające.
Problem pojawia się przy dodawaniu/odejmowaniu okresów czasu. Różne kraje, również leżące w obrębie jednego obszaru „przesunięcia” względem UTC, mają różne terminy przechodzenia z czasu letniego na zimowy i odwrotnie. Dlatego, jeżeli zależy nam na przenoszeniu się w czasie w obliczeniach, powinniśmy uwzględnić w bazie danych dokładną strefę czasową. PHP przyjmuje ją w formacie [cc_]Europe/Warsaw[/cc]. Pełną listę stref czasowych znajdziemy w dokumentacji PHP. Poza tym zapomnijmy o funkcjach strefy czasu w bazach danych – one nigdy nie funkcjonują zbyt dobrze. Oprzyjmy się na strefie czasowej zapisanej np. w typie char w bazie oraz typu czasowego ignorującego strefę czasową. W przypadku MySQL jest to [cc_]DATETIME[/cc]. Kolejnym ważnym krokiem jest aktualizacja danych o strefach czasowych dla PHP. W tym celu instalujemy rozszerzenie timezonedb.
Chcącym bardziej zagłębić się w ten temat polecam blog Dericka Rethansa i jego wpis na ten temat.
Wystraszonym zwracam jeszcze raz uwagę – problem dotyczy tylko dodawania lub odejmowania przedziałów czasu. Jeżeli przeliczamy tylko aktualny czas pomiędzy miejscami na Ziemi, nie mamy się czego obawiać.
Leave a Reply