Timezone

From Cloudrexx Development Wiki
Jump to: navigation, search

Notwendige Vorkenntnisse

http://de.wikipedia.org/wiki/UTC

Problem

Alle Zeitfunktionen im PHP und MySQL verwenden eine Zeitzone um ein Datum oder eine Uhrzeit generieren zu können. Jeder Server hat eine Standard-Zeitzone definiert, welche von den entsprechenden PHP- oder MySQL-Funktionen verwendet wird. Diese Standard-Zeitzone entspricht normalerweise dem Standort des Servers und kann bei bedarf selbst festgelegt werden. Solange der Benutzer, welcher Contrexx verwendet, sich in der selben Zeitzone wie der Server befindet, spielt es keine Rolle, ob Contrexx seine eigene Zeitzone festlegt. Sobald sich aber der Server in einer anderen Zeitzone als der Benutzer befindet, gibt es ein Problem: Angenommen ein Benutzer, welcher sich in der Schweiz befindet, erstellt um 14:00 Uhr Ortszeit einen Eintrag in einem Contrexx-Modul und sendet die entsprechende Anfrage ab. Contrexx, welches auf einem Server in Australien installiert ist, bearbeitet die Anfrage und speichert den Eintrag in der Datenbank ab. Um das Erstellungsdatum zu generieren wurde die PHP-Zeitfunktion time() verwendet. Da Contrexx keine Zeitzone festgelegt hat, welche der Schweiz entspricht, verwendet time() die Standard-Zeitzone des Servers, welche Australien entspricht. Somit wird der Eintrag in der Datenbank mit dem Erstellungsdatum 22:00 Uhr abgespeichert, was ja die aktuelle Ortszeit in Australien ist.

Lösung

Niemals die Standard-Zeitzone des Servers verwenden! Contrexx muss immer seine eigene Zeitzone (in PHP als auch MySQL) setzen, welche dem Ort des Benutzers entspricht. Darum gibt es im Contrexx während dem Installieren und in den Grundeinstellungen die Einstellung "Zeitzone" (seit Contrexx 3.0.0).

Best Practice

  • Niemals die Zeitzone des Servers verwenden, sondern immer selbst eine Zeitzone festlegen (in PHP und MySQL).
  • Nur PHP-Zeitfunktionen und keine MySQL-Zeitfunktionen verwenden: Somit können Zeit-Unstimmigkeiten zwischen PHP- und MySQL-Server vermieden werden.
  • Datum und Uhrzeit in der Datenbank immer als UTC-Zeit abspeichern. Damit keine Konvertierungen im PHP von der festgelegten Zeitzone in die UTC-Zeitzone bzw. umgekehrt durchgeführt werden müssen, sollte der MySQL-Datentyp "TIMESTAMP" verwendet werden: Dieser konvertiert beim Speichern im Hintergrund die entsprechende Zeit von der gesetzten Zeitzone in UTC und beim Auslesen von UTC in die zur Zeit gesetzten Zeitzone. Die Datentypen "DATETIME", "DATE", "TIME" und "YEAR" dagegen beachten die Zeitzone nicht.
  • Beim Exportieren der Datenbank mittels mysqldump ist standardmässig die Option --tz-utc gesetzt, welche bewirkt, dass Daten von Feldern mit dem Datentyp "TIMESTAMP" in UTC exportiert werden. Damit nach dem Importieren des Dumps die Daten wieder in der richtigen Zeitzone vorliegen, muss überprüft werden, ob im Dump folgendes enthalten ist: "SET TIME_ZONE='+00:00';".

Zeitzonen-Datenbank

MySQL

Wenn MySQL auf einem UNIX-System installiert ist, so wird auf dessen Zeitzonen-Datenbank zugegriffen, welche sich in den meisten Fällen unter "/usr/share/zoneinfo" befindet. Ist MySQL aber auf einem Windows-System installiert, steht diese Zeitzonen-Datenbank nicht zur Verfügung. In diesem Fall gibt es zwei Möglichkeiten:
a) Die Zeitzonen-Datenbank wird manuell importiert (weitere Informationen unter http://dev.mysql.com/downloads/timezones.html und http://dev.mysql.com/doc/refman/5.1/en/mysql-tzinfo-to-sql.html)
b) Anstelle des Namens (z. B. "Europe/Zurich") wird der Offset (z. B. "+02:00") der Zeitzone gesetzt.

PHP

PHP hat eine Zeitzonen-Datenbank integriert. Demzufolge spielt es keine Rolle, ob PHP auf einem UNIX- oder Windows-System installiert ist.

Olsen-Datenbank

PHP als auch UNIX verwenden die Zeitzonen-Datenbank "Olsen" (weitere Informationen unter http://en.wikipedia.org/wiki/Tz_database). Demzufolge können Zeitzonen-Unstimmigkeiten zwischen PHP und MySQL ausgeschlossen werden.

Hinweise