Как преобразовать 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');
Дмитрий
источник