date_default_timezone_set()
Erfahren Sie, wie Sie mit PHP date_default_timezone_set() die Zeitzone für alle Datums-/Zeitfunktionen im Skript steuern – mit Beispielen und Hinweisen.
Einführung
Die Funktion date_default_timezone_set() legt die Standard-Zeitzone fest, die von allen Datums-/Zeitfunktionen in einem PHP-Skript verwendet wird. Sobald sie aufgerufen wird, interpretieren und formatieren Funktionen wie date(), mktime(), strtotime() und DateTime Zeiten relativ zu dieser Zeitzone. Diese Seite erklärt, was die Funktion tut, wann Sie sie benötigen und welche Fallstricke zu beachten sind.
Syntax
date_default_timezone_set(string $timezoneId): bool$timezoneId ist ein Zeitzonenkennzeichner-string aus der IANA-Datenbank, wie zum Beispiel Europe/London oder Asia/Tokyo — keine Abkürzung wie EST. Die Funktion gibt true bei Erfolg zurück und false, wenn der Bezeichner ungültig ist. Bei einem ungültigen Bezeichner gibt PHP außerdem eine E_WARNING aus und fällt auf die zuvor konfigurierte Zeitzone zurück.
Warum es wichtig ist
Ein Zeitstempel ist lediglich eine Anzahl von Sekunden seit der Unix-Epoche (UTC). Um diese Zahl in ein lesbares Datum umzuwandeln — „2024-03-15 14:30" — muss PHP wissen, in welcher Zeitzone es dargestellt werden soll. Wenn Sie keine festlegen, verwendet PHP den Wert date.timezone aus der php.ini, der sich zwischen Ihrem lokalen Rechner, Staging und Produktion unterscheiden kann. Diese Abweichung ist eine klassische Ursache für „die Uhrzeit ist um ein paar Stunden falsch"-Fehler.
Der frühe Aufruf von date_default_timezone_set() in Ihrem Skript macht die Zeitzone explizit und konsistent überall dort, wo Ihr Code ausgeführt wird, unabhängig von der Serverkonfiguration.
Grundlegende Verwendung
<?php
date_default_timezone_set('America/New_York');
echo date('Y-m-d H:i:s');Dies setzt die Skript-Zeitzone auf die US-Eastern Time. Jeder nachfolgende Datums-/Zeitaufruf wird nun in dieser Zone dargestellt. Das Festlegen der Zone ändert den zugrunde liegenden Zeitstempel nicht — nur die Art, wie er angezeigt wird.
Zeitzone zur Laufzeit wechseln
Sie können die Standard-Zeitzone mehr als einmal ändern. Derselbe Unix-Zeitstempel zeigt in jeder Zone eine andere Uhrzeit an:
Hier bestätigt date_default_timezone_get() die aktuell gültige Zone — nützlich beim Debuggen.
Umgang mit einem ungültigen Bezeichner
Da die Funktion bei einem ungültigen Bezeichner false zurückgibt (und warnt), sollten Sie den Rückgabewert überprüfen, wenn die Zone aus Benutzereingaben oder Konfiguration stammt:
<?php
$zone = 'Mars/Olympus_Mons'; // not a real timezone
if (@date_default_timezone_set($zone)) {
echo "Timezone set to $zone\n";
} else {
date_default_timezone_set('UTC');
echo "Invalid timezone, falling back to UTC\n";
}
// Outputs: Invalid timezone, falling back to UTCHäufig verwendete Bezeichner
PHP unterstützt Hunderte von Zeitzonen. Einige häufig verwendete:
| Region | Bezeichner |
|---|---|
| New York | America/New_York |
| Chicago | America/Chicago |
| Los Angeles | America/Los_Angeles |
| London | Europe/London |
| Paris | Europe/Paris |
| Tokio | Asia/Tokyo |
| Sydney | Australia/Sydney |
| Koordinierte Weltzeit | UTC |
Für die vollständige, maschinell generierte Liste verwenden Sie timezone_identifiers_list(), und sehen Sie sich die PHP-Zeitzonen-Referenz für eine Übersicht an.
Gute Praktiken
- Einmal festlegen, frühzeitig. Rufen Sie es nahe am Anfang Ihrer Bootstrap-/Einstiegsdatei auf, damit die gesamte Anfrage eine Zeitzone teilt.
- UTC bevorzugt speichern. Speichern Sie Zeitstempel in UTC in der Datenbank und konvertieren Sie sie nur zur Anzeige in die Zeitzone des Benutzers; dies vermeidet Mehrdeutigkeiten rund um die Sommerzeit.
- Bezeichner statt Abkürzungen verwenden.
Europe/Londonberücksichtigt automatisch die Sommerzeit;GMT/BSTtun dies nicht.
Fazit
date_default_timezone_set() gibt Ihnen explizite Kontrolle darüber, wie PHP Datums- und Zeitangaben darstellt, und sorgt für konsistentes Verhalten in allen Umgebungen. Legen Sie sie bewusst fest, validieren Sie nicht vertrauenswürdige Bezeichner, und bestätigen Sie die aktive Zone mit date_default_timezone_get(), wenn etwas nicht stimmt.