Wie konvertiere ich datetime in PHP nach ISO 8601?

103

Wie konvertiere ich meine Zeit von 2010-12-30 23:21:46in das Datumsformat ISO 8601? (-_-;)

Beeindruckend
quelle
1
@ Gordon ja, ich habe ungefähr 4.530 Ergebnisse erhalten und eine Antwort von @alex gefunden
wow
@wow bitte weisen Sie darauf hin, warum keines der 4530 Ergebnisse Ihre Frage beantwortet hat.
Gordon
1
@ Gordon Ich lerne immer noch, wie man von A nach Z schreibt, aber ich fand, dass sie mir beibringen, wie man von Z nach A schreibt :)
Wow,
@wow Nein. Sie bringen dir bei, wie man ein Alphabet schreibt ($ from, $ to). Fast alle von ihnen sagen Ihnen zu verwenden date($format, strtotime($dateString))oder das DateTimeObjektäquivalent. Sie unterscheiden sich nur in der Eingabe dieser Funktionen. Alles, was Sie tun müssen, ist , auf die entsprechenden Seiten im PHP-Handbuch zu gehen und herauszufinden, was die Eingabe ist.
Gordon
3
@ Gordon Ja, bist du richtig? Ich kannte nur das Alphabet und buchstabierte jetzt Bienenzeit. Hoffe ich bin in der richtigen Schule.
Wow

Antworten:

229

Objektorientierte

Dies ist der empfohlene Weg.

$datetime = new DateTime('2010-12-30 23:21:46');

echo $datetime->format(DateTime::ATOM); // Updated ISO8601

Verfahren

Für ältere Versionen von PHP oder wenn Sie mit Prozedurcode besser vertraut sind.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
Alex
quelle
3
Frage, die Ausgabe ist, 2010-12-30T23:21:46+1100wie man es macht 2010-12-30T23:21:46+11:00?
Wow
2
@wow Versuchen Sie dies preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Es gibt aus 2010-12-30T23:21:46+11:00.
Alex
12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
wow
8
Ich würde beachten, dass die Verwendung von DATE_ISO8601eine Datumszeichenfolge erzeugt, die sich geringfügig von ISO8601 unterscheidet (der Doppelpunkt fehlt in der TZ, ISO8601 erwartet, dass die Zeiten alle mit ODER alle ohne Doppelpunkt sind, keine Mischung) - date('c')erzeugt ein striktes gültiges Datum nach ISO 8601 - Dies kann dazu führen, dass Fehler schwer zu verfolgen sind, wenn der Code ein striktes ISO 8601-Datums- / Uhrzeitformat erwartet. Ref: en.wikipedia.org/wiki/ISO_8601
ckm
38

Nach PHP 5 können Sie echo date("c");Folgendes verwenden: form ISO 8601 formatierte datetime.

http://ideone.com/nD7piL

Hinweis für Kommentare:

In diesem Zusammenhang gelten diese beiden Ausdrücke für die Zeitzone und für das Grundformat : ±[hh]:[mm], ±[hh][mm], or ±[hh].

Beachten Sie jedoch, dass + 0X: 00 korrekt und + 0X00 für eine erweiterte Verwendung falsch ist. Also ist es besser zu benutzen date("c"). Eine ähnliche Diskussion hier .

trante
quelle
1
Beachten Sie den kleinen Unterschied mit DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck
@ Ja͢ck muss das dann runtergestimmt werden? Ein kleiner Unterschied ist normalerweise eine schlechte Idee.
Rybo111
@ rybo111 Ich sehe keinen Grund, diese Antwort herunterzustimmen. technisch beide 'c'und DATE_ISO8601erstellen gültige ISO8601-Zeitdarstellungen.
Ja͢ck
Ich habe eine Notiz hinzugefügt, um zu antworten.
Trante
@ Ja͢ck erstellt DATE_ISO8601keine gültige ISO8601-Darstellung. DATE_ATOM tut es jedoch
Captain Obvious
3

So konvertieren Sie von ISO 8601 zu Unixtimestamp:

strtotime('2012-01-18T11:45:00+01:00');
// Output : 1326883500

So konvertieren Sie von Unixtimestamp nach ISO 8601 (Zeitzonenserver):

date_format(date_timestamp_set(new DateTime(), 1326883500), 'c');
// Output : 2012-01-18T11:45:00+01:00

So konvertieren Sie von Unixtimestamp nach ISO 8601 (GMT):

date_format(date_create('@'. 1326883500), 'c') . "\n";
// Output : 2012-01-18T10:45:00+00:00

So konvertieren Sie von Unixtimestamp nach ISO 8601 (benutzerdefinierte Zeitzone):

date_format(date_timestamp_set(new DateTime(), 1326883500)->setTimezone(new DateTimeZone('America/New_York')), 'c');
// Output : 2012-01-18T05:45:00-05:00
John Slegers
quelle
1

Wenn Sie versuchen, einen Wert in datetime-local festzulegen

date("Y-m-d\TH:i",strtotime('2010-12-30 23:21:46'));

//output : 2010-12-30T23:21
Rúbia Alves
quelle
Eine ähnliche Lösung wird in den Kommentaren zur akzeptierten Antwort erwähnt
sushant047