Obszernie poradziłem sobie z tą sytuacją w aplikacji PHP/MySQL, którą napisałem dla prywatnego operatora odrzutowców nieco ponad rok temu. Istnieją różne strategie obsługi stref czasowych na tych dwóch platformach, ale wyjaśnię, jak to zrobiłem. Ustawiam serwer MySQL na UTC i uruchamiam każdy skrypt PHP w strefie czasowej określonej przez użytkownika podczas procesu rejestracji profilu użytkownika.
MySQL i PHP (PHP 5.2 i nowsze) mają natywne typy danych datetime. Datetime MySQL jest prymitywnym typem danych, podczas gdy PHP 5.2 i nowsze oferują wbudowany Klasa DateTime . Typ danych daty i godziny MySQL nie zawiera metadanych strefy czasowej, ale obiekt PHP DateTime zawsze zawiera strefę czasową. Jeśli konstruktor daty i godziny PHP nie określa opcjonalnej strefy czasowej w drugim argumencie, to konstruktor daty i godziny PHP używa zmiennej środowiskowej php.
Zarówno MySQL, jak i PHP mają domyślną strefę czasową ustawioną w plikach konfiguracyjnych. MySQL używa daty i godziny ustawionej w pliku konfiguracyjnym dla każdego połączenia z bazą danych, chyba że użytkownik określi inną strefę czasową po uruchomieniu połączenia za pomocą polecenia SET time_zone = [timezone];
. PHP ustawia również zmienną środowiskową strefy czasowej dla każdego skryptu, używając strefy czasowej ustawionej w pliku konfiguracyjnym serwera, a tę zmienną środowiskową można nadpisać za pomocą funkcji PHP date_default_timezone_set()
po uruchomieniu skryptu.
Klasa PHP DateTime ma właściwość o nazwie strefa czasowa , który jest obiektem PHP DateTimeZone . Obiekt DateTimeZone jest określany przy użyciu ciągu dla dokładnej strefy czasowej. lista stref czasowych jest wszechstronna i obejmuje setki indywidualnych stref czasowych na całym świecie. Strefy czasowe PHP będą automatycznie uwzględniać czas letni.
Gdy użytkownik generuje datę i godzinę w aplikacji internetowej, skonstruuj obiekt daty i godziny PHP w strefie czasowej profilu użytkownika. Następnie użyj setTimezone
metoda, aby zmodyfikować obiekt DateTime na strefę czasową UTC. Teraz masz datę i godzinę użytkownika w UTC i możesz przechowywać wartość w bazie danych. Użyj DateTime format
metoda wyrażania danych w postaci ciągu znaków w formacie akceptowanym przez MySQL.
Więc użytkownik generuje datę i godzinę, a ty tworzysz obiekt daty i czasu PHP w określonej strefie czasowej użytkownika:
// set using an include file for user profile
$user_timezone = new DateTimeZone('America/New_York');
// 1st arg in format accepted by PHP strtotime
$date_object1 = new DateTime('8/9/2012 5:19 PM', $user_timezone);
$date_object1->setTimezone(new DateTimeZone('UTC'));
$formated_string = $date_object1->format('Y-m-d H:i:s');
$query_string = "INSERT INTO `t_table1` (`datetime1`) VALUES('$formated_string')";
Gdy pobierzesz wartość z bazy danych, skonstruuj w UTC, a następnie przekonwertuj na strefę czasową użytkownika.
$query_string = "SELECT `datetime1` FROM `t_table1`";
$date_object1 = new DateTime($datetime_string_from_mysql, new DateTimeZone('UTC'));
$date_object1->setTimezone($user_timezone);
$string_for_display_in_application = $date_object1->format('m/d/Y g:i a');
Korzystając z tej metody, wartości daty i godziny są zawsze przechowywane w UTC w bazie danych, a użytkownik zawsze doświadcza wartości w strefie czasowej swojego profilu. PHP skoryguje czas letni, jeśli to konieczne dla każdej strefy czasowej.
Jedna uwaga:to wyjaśnienie nie obejmuje typu danych MySQL timestamp. Do przechowywania wartości daty i godziny zalecam używanie typu datetime MySQL, a nie typu znacznika czasu. Typ danych znacznika czasu jest opisany w instrukcji tutaj .
Edytuj: Możesz utworzyć tablicę zawierającą każdy ciąg stref czasowych PHP za pomocą listIdentifiers , która jest statyczną metodą klasy DateTimeZone.