Як конвертувати дату в ISO 8601 в PHP


103

Як перетворити час 2010-12-30 23:21:46на формат дати ISO 8601? (-_-;)


1
@Gordon так, я отримав близько 4,530 результатів, і я знайшов відповідь від @alex
вау

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

1
@Gordon Я все ще вчуся писати від A до Z, але я виявив, що вони навчають мене писати від Z до A :)
Уау

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

3
@Gordon Так, ти прав. Я просто знав алфавіт і зараз пише час бджіл. Сподіваюся, я в потрібній школі.
вау

Відповіді:


229

Об'єктно-орієнтована

Це рекомендований спосіб.

$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'))приємно @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

@ rybo111 Я не бачу причин, щоб заперечувати цю відповідь; Технічно і те, 'c'і інше і DATE_ISO8601виробляють дійсні уявлення про ISO8601.
Ja͢ck

Я додав замітку, щоб відповісти.
trante

@ Ja͢ck DATE_ISO8601не дає дійсного представлення ISO8601. DATE_ATOM все ж робить
Капітан Очевидний

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.