WordPress Zeitzonen, Zeitumrechnung, UTC, GMT

WordPress hat im Vergleich zu Vanilla PHP ein paar Fallstricke, wenn es um das hantieren mit Zeit- und Datumsstrings zwischen unterschiedlichen Zeitzonen geht. Damit Ihr anderen Entwickler euch nicht so ärgern müsst wie ich, hier ein paar Tipps zu dem Thema.

Normalerweise ist die Zeitzone in PHP in der php.ini definiert. Wenn man den Eintrag in der php.ini ausliest, sollte auf einem heimischen Server „Europe/Berlin“ angezeigt werden:

echo ini_get('date.timezone'); 
// Europe/Berlin

Nun ist es in WordPress aber so, dass grundsätzlich (in der wp-settings.php) die Zeitzone überschrieben wird mit date_default_timezone_set( 'UTC' );   Das wird auch sichtbar, wenn man mit date_default_timezone_get(); die aktuell eingestellte Zeitzone abruft.

echo date_default_timezone_get();
// UTC

Das bedeutet aber, dass die Befehle date() und gmdate() im WordPress script immer das gleiche, nämlich die UTC Zeit ausgeben. GMT und UTC stehen übrigens für die gleiche Zeitzone, vereinfacht ausgedrückt.

Die in WordPress unter Einstellungen → Allgemein eingestellte Zeitzone bekommt man über eine Abfrage des entsprechenden Eintrags in der Datenbank:

echo get_option( 'timezone_string' );
// Europe/Berlin

Auch wenn diese Entscheidung fragwürdig ist, ist dringend davon abzuraten, eigenständig die Zeitzone, z.B. per date_default_timezone_set('Europe/Berlin') zu setzen, da WordPress einfach generell davon ausgeht, dass die Zeitzone auf UTC/GMT eingestellt ist und damit Zeitanzeigen verfälscht werden würden.

Arbeiten mit Zeitzonen in WordPress

Wie geht man als WordPress Entwickler nun damit um? WordPress hat natürlich ein paar Hilfsfunktionen zum Jonglieren mit Zeit- und Datumswerten. Generell sollte man Daten (Plural von Datum 😉 ) in der UTC-Zeit in der Datenbank speichern. So hat man eine verlässliche Basis, von der man in die gewünschte Zeitzone umrechnen kann.

Lokale Zeit zu GMT/UTC Zeit umrechnen

get_gmt_from_date() dient dazu, ein Datum der lokalen Zeit in UTC umzurechnen, etwa, wenn man eine Benutzereingabe verarbeitet und in der Datenbank speichern will.

echo get_gmt_from_date('2019-02-07 12:00:00');
// Bei eingestellter Zeitzone Europe/Berlin eine Stunde früher:
// 2019-02-07 11:00:00

 

GMT/UTC zu lokaler Zeit umrechnen

get_date_from_gmt() ist für den umgekehrten Fall, wenn ich beispielsweise ein Datum aus der Datenbank auslese und in der lokalen Zeit ausgeben will.

echo get_date_from_gmt('2019-02-07 12:00:00');
// Bei eingestellter Zeitzone Europe/Berlin eine Stunde später:
// 2019-02-07 13:00:00

Für beide Funktionen ist zu beachten, dass die Zeit im mySQL Datumsformat 'Y-m-d H:i:s' übergeben werden muss, ein anderes Format müsste man also zuerst umrechnen. Das Ausgabeformat kann angepasst werden.