Jak przekonwertować datę i godzinę na ISO 8601 w PHP

103

Jak przekonwertować czas z 2010-12-30 23:21:46na format daty ISO 8601? (-_-;)

łał
źródło
1
@Gordon tak, mam około 4530 wyników i znalazłem odpowiedź od @alex
wow
@wow proszę wskazać, dlaczego żaden z 4530 wyników nie odpowiedział na Twoje pytanie.
Gordon,
1
@Gordon Wciąż uczę się pisać od A do Z, ale okazało się, że uczą mnie, jak pisać od Z do A :)
wow
@wow Nie. Nauczą Cię pisać alfabetem ($ od, $ do). Prawie wszystkie z nich mówią, aby użyć date($format, strtotime($dateString))lub DateTimeodpowiednika obiektu. Różnią się jedynie danymi wejściowymi do tych funkcji. Wszystko, co musisz zrobić, to przejść do odpowiednich stron w podręczniku PHP i dowiedzieć się, jakie są dane wejściowe.
Gordon,
3
@Gordon Tak, masz rację. Po prostu znałem alfabet, a teraz pisuję czas pszczół. Mam nadzieję, że jestem w odpowiedniej szkole.
wow

Odpowiedzi:

229

Zorientowany obiektowo

To jest zalecany sposób.

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

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

Proceduralny

Dla starszych wersji PHP lub jeśli czujesz się bardziej komfortowo z kodem proceduralnym.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));
Alex
źródło
3
Pytanie, wynik jest 2010-12-30T23:21:46+1100jak to zrobić 2010-12-30T23:21:46+11:00?
wow
2
@wow Spróbuj tego preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Wyprowadza 2010-12-30T23:21:46+11:00.
alex
12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
wow
8
Chciałbym zauważyć, że użycie DATE_ISO8601daje ciąg daty, który jest nieco inny niż ISO8601 (dwukropek brakuje w TZ, ISO8601 oczekuje, że czasy będą wszystkie z OR bez dwukropka, a nie mieszanką) - date('c')daje ścisłą datę ważności ISO 8601 - Może to spowodować trudne do wyśledzenia błędy, jeśli kod oczekuje ścisłego formatu daty i godziny ISO 8601. Ref: en.wikipedia.org/wiki/ISO_8601
ckm
38

Po PHP 5 możesz użyć tego: echo date("c");formularz daty i godziny w formacie ISO 8601.

http://ideone.com/nD7piL

Uwaga dotycząca komentarzy:

W odniesieniu do tego , oba te wyrażenia są ważne dla strefy czasowej, dla formatu podstawowego: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Należy jednak pamiętać, że + 0X: 00 jest poprawne, a + 0X00 jest nieprawidłowe w przypadku dłuższego użytkowania. Więc lepiej jest użyć date("c"). Podobna dyskusja tutaj .

trante
źródło
1
Zwróć uwagę na niewielką różnicę z DATE_ISO8601; +0X:00vs +0X00.
Ja͢ck,
@ Ja͢ck czy to wymaga głosowania w dół? Niewielka różnica to zwykle zły pomysł.
rybo111
@ rybo111 Nie widzę powodu, aby głosować negatywnie na tę odpowiedź; technicznie, oba 'c'i DATE_ISO8601tworzą prawidłowe reprezentacje czasu ISO8601.
Ja͢ck
Dodałem notatkę do odpowiedzi.
trante
@ Ja͢ck DATE_ISO8601nie tworzy prawidłowej reprezentacji ISO8601. DATE_ATOM robi jednak
Kapitan Oczywiste
4

Jak przekonwertować z ISO 8601 do unixtimestamp:

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

Jak przekonwertować z unixtimestamp do ISO 8601 (serwer strefy czasowej):

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

Jak przekonwertować z unixtimestamp do ISO 8601 (GMT):

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

Jak przekonwertować z unixtimestamp do ISO 8601 (niestandardowa strefa czasowa):

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
źródło
1

Jeśli spróbujesz ustawić wartość w datetime-local

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

//output : 2010-12-30T23:21
Rúbia Alves
źródło
Podobne rozwiązanie jest wspomniane w komentarzach do zaakceptowanej odpowiedzi
sushant047