wake-up-neo.net

PHP Zeitstempel in DateTime

Wissen Sie, wie ich dies in eine strtotime umwandeln kann oder einen ähnlichen Wert in das DateTime Objekt übergeben kann?

Das Datum, das ich habe:

Mon, 12 Dec 2011 21:17:52 +0000

Was ich probiert 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 richtig. Wenn ich viele verschiedene Daten durchlaufe, ist alles dasselbe Datum.

61
JREAM

Sie müssen die Zeichenfolge nicht in einen Zeitstempel umwandeln, um das DateTime-Objekt zu erstellen (der Konstruktor erlaubt Ihnen sogar nicht, dies zu tun, wie Sie feststellen können). Sie können Ihre Datumszeichenfolge einfach in den Konstruktor DateTime eingeben, wie er ist:

// Assuming $item->pubDate is "Mon, 12 Dec 2011 21:17:52 +0000"
$dt = new DateTime($item->pubDate);

Wenn Sie jedoch eine Zeitmarke haben, die Sie anstelle einer Zeichenfolge verwenden möchten, können Sie dies mithilfe von DateTime::setTimestamp() tun:

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime();
$dt->setTimestamp($timestamp);

Edit (2014-05-07):

Das war mir zu diesem Zeitpunkt eigentlich nicht bewusst, aber der DateTime-Konstruktor do unterstützt das Erstellen von Instanzen direkt aus Zeitstempeln. Gemäß dieser Dokumentation müssen Sie dem Zeitstempel lediglich ein @-Zeichen voranstellen:

$timestamp = strtotime('Mon, 12 Dec 2011 21:17:52 +0000');
$dt = new DateTime('@' . $timestamp);
111
FtDRbwLXw6

Während @drrcknlsn richtig ist, um zu behaupten, dass es mehrere Möglichkeiten gibt, eine Zeitzeichenfolge in eine Datumszeit umzuwandeln, ist es wichtig zu wissen, dass diese unterschiedlichen Arten mit Zeitzonen nicht auf dieselbe Weise 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 nimmt GMT (Europe/Brussels) an.

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 aus ausführen, erhalte ich folgende Ausgabe:

2011-12-12T14:17:52+01:00

Im Gegensatz zur date_create-Funktion nimmt die setTimestamp-Methode die Zeitzone des Servers (in meinem Fall 'Europe/Brussels') anstelle von GMT an.


Stellen Sie Ihre Zeitzone explizit ein

Wenn Sie sicherstellen möchten, dass Ihre Ausgabe der Zeitzone Ihrer Eingabe entspricht, legen Sie diese am besten explizit fest.

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, erzeugen beide dieselbe (korrekte) Ausgabe:

2011-12-12T21:17:52+08:00
22
John Slegers

Die einfachste Lösung ist wahrscheinlich:

DateTime::createFromFormat('U', $timeStamp);

Wobei 'U' Unix-Epoche bedeutet. Siehe Dokumente: http://php.net/manual/de/datetime.createfromformat.php

12
forsberg

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);
    }
0
ingenious