Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Korzystanie ze stref czasowych w aplikacji internetowej PHP

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kod błędu MySQL 1452 Ograniczenie klucza obcego

  2. Korzystanie z Oracle JDeveloper z MySQL Database Service na Oracle Cloud Platform, część 1

  3. Znajdź liczbę kolumn w tabeli

  4. Metoda wyceny PDO

  5. Ustawić NOW() jako wartość domyślną dla typu danych datetime?