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. Wenn dort eine Zeitzone verwendet wird, die Sommer- und Winterzeit (DST - Daylight Savings Time) unterscheidet, so werden Daten im Sommer und im Winter u.U. nicht gleich berechnet.

Zudem sollte der Benutzer sich Daten in seiner Zeitzone anzeigen lassen können. Dazu muss das Datum für den jeweiligen Benutzer umgerechnet werden.

Lösung

Die Unterscheidung zwischen folgenden Zeitzonen führt zur Lösung:

  • Zeitzone des Benutzers (/zur Ausgabe)
  • Zeitzone für Berechnungen
  • Zeitzone für Datenablage

Die Zeitzonen können theor. auch alle gleich sein. Wichtig ist, dass die Zeitzone zur Datenablage keine DST beachtet (z.B. UTC).

Seit Contrexx 3.0.0 wird während der Installation eine Zeitzone ausgewählt. Da Contrexx/Cloudrexx (noch) nicht unterscheidet zwischen der Zeitzone des Benutzers und für die Berechnungen, sind diese identisch gesetzt. Lediglich beim Auslesen aus der Datenablage findet eine Zeitzonenumrechnung statt.

Best Practice

  • Die Zeitzone der Datenbankablage selbst festlegen (nicht die Zeitzone des Datenbankservers verwenden!)
  • Als Zeitzone für die Datenbankablage eine Zeitzone ohne DST verwenden (WICHTIG!)
  • Nur PHP-Zeitfunktionen und keine MySQL-Zeitfunktionen verwenden: Somit können Zeit-Unstimmigkeiten zwischen PHP- und MySQL-Server vermieden werden.
  • Die MySQL-Datentypen DATETIME/DATE/TIME verwenden, TIMESTAMP vermeiden. Der Datentyp TIMESTAMP unterliegt dem y2038-Problem[1][2].
  • Bei Referenzen auf einen ortsunabhängigen Zeitpunkt (Beispiele wären: "weltweit gleiche (/von der Zeitzone unabhängige) Öffnungszeiten von 9-17 Uhr" oder "Silvester am 31.12. um 24:00") müssen DATE und TIME (allenfalls in Kombination) verwendet werden. Bei ortsabhängigen Zeipunkten muss DATETIME verwendet werden (z.B. Silvesterparty in Zürich um 23 Uhr).
  • 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.

Cloudrexx verwendet Möglichkeit b).

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

  • https://bugs.mysql.com/bug.php?id=12654
  • https://mariadb.com/kb/en/library/unix_timestamp/
  • Retrieved from "https://wiki.cloudrexx.com/index.php?title=Timezone&oldid=26063"