Einleitung: Warum Zeit zur Qual werden kann
\n\nStell dir vor: Du entwickelst einen Online-Shop. Ein Kunde aus New York gibt um 15:00 Uhr Ortszeit eine Bestellung auf. Du speicherst das Datum in der Datenbank. Doch der Server in Moskau interpretiert es als 22:00 Uhr. Das Chaos ist perfekt: Lieferungen verspäten sich, Berichte stimmen nicht, Kunden sind verärgert.
\n\nKommt dir das bekannt vor? Willkommen in der Welt der PHP Zeitzonen. Dieses Thema ist eine echte Herausforderung für Anfänger und selbst erfahrene Entwickler. Aber die gute Nachricht: Wenn du es einmal richtig verstanden und konfiguriert hast, wirst du nie wieder Kopfschmerzen mit Datumsangaben haben.
\n\nIn diesem Artikel zeigen wir dir, wie du mit Zeitzonen in PHP arbeitest, Fallstricke bei der Sommerzeit vermeidest und warum UTC dein bester Freund ist. Los geht's!
\n\nGlobale Zeitzonenkonfiguration in PHP
\n\nDer erste Schritt: Stelle sicher, dass PHP weiß, in welcher Zeitzone dein Server läuft. Dies erfolgt über die Direktive date.timezone in der php.ini oder direkt im Code mit der Funktion date_default_timezone_set().
// Zeitzone für das gesamte Skript setzen\ndate_default_timezone_set('Europe/Berlin');\n\necho date('Y-m-d H:i:s'); // Gibt die aktuelle Zeit für Berlin aus\n\nAchtung: Wenn du mit Nutzern aus verschiedenen Ländern arbeitest, ist eine feste Zeitzone für das gesamte Projekt keine gute Idee. Speichere die Zeit besser immer in UTC (koordinierte Weltzeit) und konvertiere sie für den jeweiligen Benutzer.
\n\nAktuelle Zeitzone prüfen
\n\nEs ist immer nützlich zu wissen, welche Zeitzone gerade eingestellt ist:
\n\necho date_default_timezone_get(); // Z.B.: 'Europe/Berlin'\n\nDas DateTimeZone-Objekt – dein wichtigstes Werkzeug
\n\nPHP bietet das mächtige Objekt DateTimeZone. Es erlaubt dir, mit Zeitzonen als eigenständige Entitäten zu arbeiten. Schauen wir uns ein einfaches Beispiel an:
\n\n$timezone = new DateTimeZone('America/New_York');\n$datetime = new DateTime('now', $timezone);\n\necho $datetime->format('Y-m-d H:i:s'); // Aktuelle Zeit in New York\n\nBeachte: Wir haben die Zeitzone direkt an den DateTime-Konstruktor übergeben. Das ist die sauberste Methode, um mit Zeitzonen in PHP zu arbeiten.
Liste aller verfügbaren Zeitzonen
\n\nDu möchtest wissen, welche Zeitzonen PHP überhaupt unterstützt? Rufe die Methode listIdentifiers() auf:
$zones = DateTimeZone::listIdentifiers();\necho count($zones); // Über 400 Zonen!\n\n// Die ersten 10 ausgeben\nprint_r(array_slice($zones, 0, 10));\n\nDiese Liste ist riesig. Du musst sie nicht alle auswendig kennen – es reicht, die Standard-Identifikatoren wie Europe/Berlin, Asia/Tokyo oder UTC zu kennen.
Konvertierung zwischen Zeitzonen
\n\nDie häufigste Aufgabe: Eine Zeit von einer Zeitzone in eine andere umrechnen. In PHP gelingt das elegant mit der Methode setTimezone().
// Zeit in UTC\n$utcTime = new DateTime('2025-03-15 12:00:00', new DateTimeZone('UTC'));\n\n// Konvertieren nach Tokio\n$tokyoTime = clone $utcTime;\n$tokyoTime->setTimezone(new DateTimeZone('Asia/Tokyo'));\n\necho $utcTime->format('Y-m-d H:i:s') . ' UTC'; // 2025-03-15 12:00:00 UTC\necho ' = ';\necho $tokyoTime->format('Y-m-d H:i:s') . ' Tokio'; // 2025-03-15 21:00:00 Tokio\n\nBeachte: Wir haben clone verwendet, um das ursprüngliche Objekt nicht zu verändern. Ohne diesen Schritt würde die ursprüngliche Zeit ebenfalls nach Tokio "umziehen".
Beste Praxis: Alles in UTC speichern
\n\nDie goldene Regel der Webentwicklung: Speichere Datums- und Zeitangaben immer in UTC. Datenbank, Cache, Logs – überall UTC. Die Konvertierung für den Benutzer erfolgt erst bei der Ausgabe.
\n\n// In der Datenbank speichern (Beispiel)\n$nowUTC = new DateTime('now', new DateTimeZone('UTC'));\n$db->query("INSERT INTO orders (created_at) VALUES ('" . $nowUTC->format('Y-m-d H:i:s') . "')");\n\nSo vermeidest du Verwirrung und stellst sicher, dass deine Anwendung weltweit zuverlässig funktioniert.