Während @drrcknlsn zu Recht behauptet, dass es mehrere Möglichkeiten gibt, eine Zeitzeichenfolge in eine Datenzeit umzuwandeln, ist es wichtig zu wissen, dass diese verschiedenen Methoden nicht auf dieselbe Weise mit Zeitzonen umgehen.
Option 1 : DateTime('@' . $timestamp)
Betrachten Sie den folgenden Code:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Das strtotime
Bit eliminiert die Zeitzoneninformationen und die date_create
Funktion setzt GMT ( Europe/Brussels
) voraus .
Daher ist die Ausgabe die folgende, unabhängig davon, auf welchem Server ich sie ausführe:
2011-12-12T13:17:52+00:00
Option 2 : date_create()->setTimestamp($timestamp)
Betrachten Sie den folgenden Code:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800')), 'c');
Sie können erwarten, dass dies die gleiche Ausgabe erzeugt. Wenn ich diesen Code jedoch von einem belgischen Server ausführe, erhalte ich die folgende Ausgabe:
2011-12-12T14:17:52+01:00
Im Gegensatz zur date_create
Funktion nimmt die setTimestamp
Methode eher die Zeitzone des Servers ( 'Europe/Brussels'
in meinem Fall) als GMT an.
Explizite Einstellung Ihrer Zeitzone
Wenn Sie sicherstellen möchten, dass Ihre Ausgabe mit der Zeitzone Ihrer Eingabe übereinstimmt, sollten Sie sie explizit festlegen.
Betrachten Sie den folgenden Code:
date_format(date_create('@'. strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Betrachten Sie nun auch den folgenden Code:
date_format(date_create()->setTimestamp(strtotime('Mon, 12 Dec 2011 21:17:52 +0800'))->setTimezone(new DateTimeZone('Asia/Hong_Kong')), 'c')
Da wir die Zeitzone der Ausgabe explizit so einstellen, dass sie mit der der Eingabe übereinstimmt, erstellen beide dieselbe (korrekte) Ausgabe:
2011-12-12T21:17:52+08:00