Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwenden von Zeitzonen in einer PHP-Webanwendung

Ich habe mich ausführlich mit dieser Situation in einer PHP/MySQL-Anwendung beschäftigt, die ich vor etwas mehr als einem Jahr für einen Privatjet-Betreiber geschrieben habe. Es gibt verschiedene Strategien, um Zeitzonen auf diesen beiden Plattformen zu handhaben, aber ich werde erklären, wie ich es gemacht habe. Ich setze den MySQL-Server auf UTC und führe jedes PHP-Skript in der Zeitzone aus, die der Benutzer während des Anmeldevorgangs für das Benutzerprofil angibt.

MySQL und PHP (PHP 5.2 und höher) haben beide native datetime-Datentypen. Datetime von MySQL ist ein primitiver Datentyp, während PHP 5.2 und höher den eingebauten DateTime-Klasse . Der MySQL-Datentyp „datetime“ enthält keine Metadaten für die Zeitzone, aber ein PHP-DateTime-Objekt enthält immer eine Zeitzone. Wenn der PHP-Datetime-Konstruktor die optionale Zeitzone im zweiten Argument nicht angibt, verwendet der PHP-Datetime-Konstruktor die PHP-Umgebungsvariable.

Sowohl MySQL als auch PHP haben in den Konfigurationsdateien eine Standardzeitzone festgelegt. MySQL verwendet die datetime, die in der Konfigurationsdatei eingestellt ist für jede DB-Verbindung, es sei denn, der Benutzer gibt eine andere Zeitzone an, nachdem die Verbindung mit dem Befehl SET time_zone = [timezone]; gestartet wurde . PHP legt auch eine Zeitzonen-Umgebungsvariable für jedes Skript fest, wobei die in der Serverkonfigurationsdatei festgelegte Zeitzone verwendet wird, und diese Umgebungsvariable kann mit der PHP-Funktion date_default_timezone_set() nach dem Start des Skripts.

Die PHP-Klasse DateTime hat eine Eigenschaft namens timezone , das ein PHP-DateTimeZone-Objekt ist . Das DateTimeZone-Objekt wird mit einer Zeichenfolge für die genaue Zeitzone angegeben. Die Liste der Zeitzonen ist umfassend und verfügt über Hunderte von einzelnen Zeitzonen auf der ganzen Welt. Die PHP-Zeitzonen berücksichtigen automatisch die Sommerzeit.

Wenn der Benutzer eine Datetime in der Web-App generiert, konstruieren Sie ein PHP-Datetime-Objekt in der Zeitzone des Benutzerprofils. Verwenden Sie dann den setTimezone -Methode zum Ändern des DateTime-Objekts in die UTC-Zeitzone. Jetzt haben Sie die Datumszeit des Benutzers in UTC und können den Wert in der Datenbank speichern. Verwenden Sie das DateTime format Methode, um die Daten als Zeichenfolge in dem von MySQL akzeptierten Format auszudrücken.

Der Benutzer generiert also eine DateTime und Sie erstellen ein PHP-DateTime-Objekt in der vom Benutzer angegebenen Zeitzone:

// 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')";

Wenn Sie den Wert aus der Datenbank abrufen, erstellen Sie ihn in UTC und konvertieren Sie ihn dann in die Zeitzone des Benutzers.

$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');

Mit dieser Methode werden Ihre datetime-Werte immer in UTC innerhalb der Datenbank gespeichert, und der Benutzer sieht die Werte immer in der Zeitzone seines Profils. PHP korrigiert die Sommerzeit bei Bedarf für jede Zeitzone.

Ein Fallstrick:Diese Erklärung deckt den MySQL-Zeitstempel-Datentyp nicht ab. Ich empfehle, den Datetime-Datentyp von MySQL zu verwenden, um Datetime-Werte zu speichern, nicht den Datentyp timestamp. Der Zeitstempel-Datentyp wird hier im Handbuch behandelt .

Bearbeiten: Sie können mit listIdentifiers ein Array erzeugen, das jeden PHP-Zeitzonen-String enthält , die eine statische Methode der DateTimeZone-Klasse ist.