Как преобразовать datetime в ISO 8601 в PHP


104

Как преобразовать время из 2010-12-30 23:21:46формата даты ISO 8601? (-_-;)


1
@Gordon да, я получил около 4530 результатов, и я нашел ответ от @alex
вау,

@wow, укажите, почему ни один из результатов 4530 не дал ответа на ваш вопрос.
Гордон

1
@Gordon Я все еще учусь писать от А до Я, но я обнаружил, что они учат меня писать от Я до А :)
вау,

@wow Нет. Они учат вас писать алфавит ($ от, $ до). Почти все они говорят вам использовать date($format, strtotime($dateString))или DateTimeобъект эквивалент. Они отличаются только входными данными для этих функций. Все, что вам нужно сделать, это перейти на соответствующие страницы в Руководстве по PHP и выяснить, что это за ввод.
Гордон

3
@ Гордон Да, ты прав. Я просто знал алфавит, а теперь пишу по буквам. Надеюсь, я учусь в правильной школе.
вау,

Ответы:


231

Объектно-ориентированный

Это рекомендуемый способ.

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

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

Процедурный

Для более старых версий PHP или если вам удобнее работать с процедурным кодом.

echo date(DATE_ISO8601, strtotime('2010-12-30 23:21:46'));

3
Вопрос, вывод 2010-12-30T23:21:46+1100как сделать так, чтобы он был 2010-12-30T23:21:46+11:00?
вау,

2
@wow Попробуй preg_replace('/(?<=\d{2})(?=\d{2}$)/', ':', '2010-12-30T23:21:46+1100'). Он выводит 2010-12-30T23:21:46+11:00.
Alex


12
date('c', strtotime('2010-12-30 23:21:46'))nice @Gordon :)
вау,

8
Я хотел бы отметить, что использование DATE_ISO8601создает строку даты, которая немного отличается от ISO8601 (двоеточие отсутствует в TZ, ISO8601 ожидает, что время будет все с ИЛИ все без двоеточия, а не смесь) - date('c')создает строгую действительную дату ISO 8601 - Это может затруднить отслеживание ошибок, если код ожидает строгого формата даты и времени ISO 8601. Ссылка: en.wikipedia.org/wiki/ISO_8601
ckm

38

После PHP 5 вы можете использовать это: echo date("c");форма даты и времени в формате ISO 8601.

http://ideone.com/nD7piL

Примечание для комментариев:

Касательно этого , оба эти выражения справедливы для часового пояса, для базового формата: ±[hh]:[mm], ±[hh][mm], or ±[hh].

Но обратите внимание, что + 0X: 00 является правильным, а + 0X00 неправильным для расширенного использования. Так что лучше использовать date("c"). Аналогичное обсуждение здесь .


1
Обратите внимание на небольшую разницу с DATE_ISO8601; +0X:00против +0X00.
Ja͢ck

@ Ja͢ck, тогда нужно голосование против? Небольшая разница - плохая идея.
rybo111 03

@ rybo111 Я не вижу причин отклонять этот ответ; технически оба 'c'и DATE_ISO8601производят действительные представления времени ISO8601.
Jack

Я добавил примечание к ответу.
trante 04

@ Ja͢ck DATE_ISO8601не дает действительного представления ISO8601. DATE_ATOM, хотя
Captain Obvious

4

Как преобразовать ISO 8601 в unixtimestamp:

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

Как преобразовать unixtimestamp в ISO 8601 (сервер часовых поясов):

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

Как преобразовать unixtimestamp в ISO 8601 (GMT):

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

Как преобразовать unixtimestamp в ISO 8601 (настраиваемый часовой пояс):

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


1

Если вы попытаетесь установить значение в datetime-local

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

//output : 2010-12-30T23:21

Подобное решение упоминается в комментариях к принятому ответу
sushant047

0

Вы можете попробовать такой способ:

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

echo $datetime->format(DATE_ATOM);

Также:

echo $datetime->format('c');
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.