Umgang mit PHP-Server und MySQL-Server in verschiedenen Zeitzonen


11

Für diejenigen von uns, die Standard-Shared-Hosting-Pakete wie GoDaddy oder Network Solutions verwenden, wie behandeln Sie Datetime-Konvertierungen, wenn Ihr Hosting-Server (PHP) und MySQL-Server sind verschiedene Zeitzonen?

Hat auch jemand Best-Practice-Ratschläge, um zu bestimmen, in welcher Zeitzone sich ein Besucher Ihrer Site befindet, und um eine Datetime-Variable entsprechend zu manipulieren?

17

Ab PHP 5.1.0 Sie date_default_timezone_set() Funktion können Sie die Standard-Zeitzone wird von allen Datums-/Zeitfunktionen in einem Script verwendet einzustellen.

Für MySql (zitiert von MySQL Server Time Zone Support Seite)

Vor MySQL 4.1.3 arbeitet der Server nur in der Systemzeitzone beim Start eingestellt. Ab MySQL 4.1.3 verwaltet der Server mehrere Zeitzoneneinstellungen, von denen einige zur Laufzeit geändert werden können.

Von Interesse für Sie pro Verbindung ist Einstellung der Zeitzonen, die Sie am Anfang Ihrer Skripte

SET timezone = 'Europe/London'; 

Wie zum Erfassen des Client-Zeitzone Einstellung verwenden würden, könnten Sie ein bisschen verwenden von JavaScript, um diese Informationen in einem Cookie zu speichern und zu speichern und sie bei nachfolgenden Lesevorgängen zu verwenden, um die richtige Zeitzone zu berechnen.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes. 
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset); 

Oder Sie könnten die chioce bieten dem Anwender selbst ihre Zeitzonen einstellen.


11

Speichern Sie alles als UTC. Sie können Conversions auf Client-Ebene oder auf der Serverseite mithilfe von Client-Einstellungen durchführen.

php - date

mysql - utc-timestamp

  0

+1 ich den unsteten Augen sehen bekommen, aber ich immer Unix/Epoche Zeit als unterzeichnet speichern int (will für Datum Mathe unterzeichnet). Keine Verwirrung und überlebt TZ-Verschiebungen der Regierung. 07 dez. 092009-12-07 20:55:13

  0

+1, die Dinge einfach zu halten und normalisiert (= in UTC) auf Datenebene macht es schwierig, die Logik falsch zu bekommen. Gebietsschemaspezifische Konvertierungen sollten nur auf Anzeigeebene durchgeführt werden. 24 sep. 122012-09-24 08:48:17


0

Ich speichere alle meine Daten als bigint, da ich Probleme mit dem dateTime-Typ hatte. Ich speichere das Ergebnis der time() PHP Funktion hinein, jetzt zählen sie als in der gleichen Zeitzone :)


3

RE die Antwort von Željko Živković, Zeitzonen Deskriptoren wie 'Europa/London' funktionieren nur wenn der mySQL Admin hat dem System die Zeitzonentabellen hinzugefügt und diese aktualisiert.

Ansonsten sind Sie auf numerische Offsets wie '-4: 00' beschränkt. Glücklicherweise ist die PHP date ('P') Format bietet es (ab 5.1.3)

So in etwa eine App-Konfigurationsdatei können Sie

define('TZ', 'US/Pacific'); 
.... 
if (defined('TZ') && function_exists('date_default_timezone_set')) { 
    date_default_timezone_set(TZ); 
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P'))); 
} 

haben Das bedeutet, PHP und mySQL wird zustimmen, auf welcher Zeitzone Offset zu verwenden.

Verwenden Sie immer TIMESTAMP zum Speichern von Zeitwerten. Die Spalte wird tatsächlich als UNIX_TIME (Epoche) gespeichert, aber implizit vom aktuellen Zeitzonenoffset konvertiert, wenn sie geschrieben wird, und zurück beim Lesen.

Wenn Sie die Zeiten für Benutzer in anderen Zeitzonen anzeigen möchten, legen Sie anstelle einer globalen Definition() die oben angegebene Zeitzone fest.TIMESTAMP-Werte werden automatisch durch mySQL durch die Zeit umgewandelt werden, um Ihre App die Ergebnismenge sehen (was manchmal ein Problem sein kann, wenn Sie tatsächlich die ursprüngliche Zeitzone des Ereignisses müssen wissen, auch dann muss es in einer anderen Spalte sein)

und so weit wie, „warum speichern nicht nur alle Zeiten als int ist“, dass Sie die Fähigkeit Daten zu vergleichen verliert und zu validieren, und bedeutet, dass Sie immer bisher Darstellung auf der App-Ebene konvertieren (und ist auf hart die Augen, wenn Sie bei den Daten direkt suchen - schnell, was bei 1254369600 passierte)


0

in pHP gesetzter Zeitzone, indem sie in der Datei php.ini: ini_set("date.timezone", "America/Los_Angeles");

?

oder in bestimmten Seite können Sie tun: date_default_timezone_set("America/Los_Angeles");

In mysql können Sie tun: SET GLOBAL time_zone = 'America/Los_Angeles';