PHP-Zeitstempel in DateTime

94

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.

JREAM
quelle

Antworten:

163

Sie müssen die Zeichenfolge nicht in einen Zeitstempel verwandeln, um das DateTimeObjekt zu erstellen (tatsächlich erlaubt Ihnen der Konstruktor nicht einmal, dies zu tun, wie Sie sehen können). Sie können Ihre Datumszeichenfolge einfach so DateTimewie sie ist in den Konstruktor eingeben:

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

Wenn Sie jedoch einen Zeitstempel haben, den Sie anstelle einer Zeichenfolge verwenden möchten, können Sie dies folgendermaßen tun DateTime::setTimestamp():

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

Bearbeiten (07.05.2014):

Ich war eigentlich nicht bekannt , dies zu der Zeit, aber der DateTimeKonstruktor tut Unterstützung Erstellen Instanzen direkt von Zeitstempel. 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);
FtDRbwLXw6
quelle
Das funktioniert super. Ich hatte das schon einmal versucht, muss es aber nicht genug Chance gegeben haben !!! danke :))
JREAM
18
Beachten Sie dies 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/… .
John Slegers
42

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 strtotimeBit eliminiert die Zeitzoneninformationen und die date_createFunktion 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_createFunktion nimmt die setTimestampMethode 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
John Slegers
quelle
27

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

Forsberg
quelle
2
Diese Methode ignoriert auch die Zeitzone
Bouke Versteegh
2
@BoukeVersteegh und welches nicht?
Forsberg
2
@BoukeVersteegh Dies ist ein Unix-Zeitstempel!, Der Sie beim Erstellen des Objekts von Zeitzonenproblemen befreit . Verwenden Sie einfach ->setTimezone, um die bevorzugte Zeitzone festzulegen, bevor Sie anrufen->format()
Buchhalter
1
@BoukeVersteegh Überprüfen Sie diesen großen Hinweis aus dem PHP-Handbuch. "Der Parameter $ timezone und die aktuelle Zeitzone werden ignoriert, wenn der Parameter $ time entweder ein UNIX-Zeitstempel ist (z. B. @ 946684800) oder eine Zeitzone angibt (z. B. 2010-01-28T15: 00: 00 + 02: 00). "
Buchhalter
1
Unix-Zeitstempel haben keine Zeitzonen, sie sind per Definition immer UTC
the_nuts
0

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);
    }
genial
quelle