Wissen Sie, wie ich dies in eine strtotime oder einen ähnlichen Wert konvertieren kann, der an das DateTime- Objekt übergeben wird?
Das Datum, das ich habe:
Mon, 12 Dec 2011 21:17:52 +0000
Was ich versucht habe:
$time = substr($item->pubDate, -14);
$date = substr($item->pubDate, 0, strlen($time));
$dtm = new DateTime(strtotime($time));
$dtm->setTimezone(new DateTimeZone(ADMIN_TIMEZONE));
$date = $dtm->format('D, M dS');
$time = $dtm->format('g:i a');
Das obige ist nicht korrekt. Wenn ich viele verschiedene Daten durchlaufe, ist alles das gleiche Datum.
quelle
new DateTime('@' . $timestamp)
und$dt = new DateTime(); $dt->setTimestamp($timestamp)
gehen Sie nicht auf die gleiche Weise mit Zeitzonen um. Weitere Informationen finden Sie in meiner Antwort unter stackoverflow.com/questions/12038558/… .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 diedate_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 diesetTimestamp
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
quelle
Die wahrscheinlich einfachste Lösung ist nur:
DateTime::createFromFormat('U', $timeStamp);
Wobei 'U' Unix-Epoche bedeutet. Siehe Dokumente: http://php.net/manual/en/datetime.createfromformat.php
quelle
->setTimezone
, um die bevorzugte Zeitzone festzulegen, bevor Sie anrufen->format()
es ist meine Lösung:
function changeDateTimezone($date, $from='UTC', $to='Asia/Tehran', $targetFormat="Y-m-d H:i:s") { $date = new DateTime($date, new DateTimeZone($from)); $date->setTimeZone(new DateTimeZone($to)); return $date->format($targetFormat); }
quelle