Дата ISO8601 в PHP в формате YYYY-MM-DDTHH:MM:SS.mmmmmmmZ

Я пытаюсь создать метку времени в PHP для использования с API. Кажется, я не могу получить временную метку в нужном формате. Правильный формат:

Формат даты и времени UTC ISO8601: ГГГГ-ММ-ДДЧЧ:ММ:СС.мммммммZ

Пример: 2013-04-24T11:11:50.2829708Z

Изменить. Позвольте мне уточнить фактическую проблему, с которой я сталкиваюсь:

Свойство «Z» возвращает смещение часового пояса в секундах. Мне нужно, чтобы смещение возвращалось, поскольку date('c') возвращает его.

Пример: +01:00 вместо 3600

Есть ли встроенная функция для этого в PHP?


person jan.wojo    schedule 12.11.2014    source источник
comment
возможный дубликат микросекунд PHP DateTime всегда возвращает 0   -  person Matteo Tassinari    schedule 12.11.2014
comment
Привет, Маттео, я довольно хорошо прочитал эти темы и обновил свой первоначальный вопрос. Я не думаю, что проблема, которую я пытаюсь решить, упоминается в них.   -  person jan.wojo    schedule 13.11.2014


Ответы (2)


Вы ищете метод DateTime::format в сочетании с средством форматирования c или DateTime::ISO8601 константа:

$timestamp = new DateTime();
echo $timestamp->format('c'); // Returns ISO8601 in proper format
echo $timestamp->format(DateTime::ISO8601); // Works the same since const ISO8601 = "Y-m-d\TH:i:sO"
person sjagr    schedule 12.11.2014
comment
вы также можете просто использовать константу: $timestamp->format(DateTime::ISO8601);, которая равна 'Y-m-d\TH:i:sO' - person prodigitalson; 13.11.2014
comment
@prodigitalson Спасибо, добавил ваш вариант с комментариями - person sjagr; 13.11.2014
comment
В итоге я использовал что-то похожее, чтобы получить окончательный формат, который мне был нужен: $t = microtime(true); $micro = sprintf("%06d",($t - floor($t)) * 1000000); $timeZoneOffset = strstr(date('c', $t), '+'); $d = new DateTime( date('Y-m-d H:i:s.'.$micro,$t)); echo $d->format("Y-m-d\TH:i:s.u" . $timeZoneOffset); - person jan.wojo; 13.11.2014

Чтобы напечатать дату в ISO 8601 в PHP, вы можете использовать довольно простую функцию процедурного стиля date(), подобную этой :

$isoDate = date('c') // outputs 2017-10-18T22:44:26+00:00 'Y-m-d\TH:i:sO'  

Или, если вы предпочитаете стиль ООП, вы можете использовать DateTime() следующим образом:

$date = DateTime('2010-01-01');
echo date_format($date, 'c');

Список форматов/констант даты, предоставляемых PHP, упоминается здесь:

const string ATOM = "Y-m-d\TH:i:sP" ;
const string COOKIE = "l, d-M-Y H:i:s T" ;
const string ISO8601 = "Y-m-d\TH:i:sO" ;
const string RFC822 = "D, d M y H:i:s O" ;
const string RFC850 = "l, d-M-y H:i:s T" ;
const string RFC1036 = "D, d M y H:i:s O" ;
const string RFC1123 = "D, d M Y H:i:s O" ;
const string RFC2822 = "D, d M Y H:i:s O" ;
const string RFC3339 = "Y-m-d\TH:i:sP" ;
const string RSS = "D, d M Y H:i:s O" ;
const string W3C = "Y-m-d\TH:i:sP" ;

Так хорошо, что у нас есть формат ISO 8601. Однако значение может отличаться от ожидаемого (YYYY-MM-DDTHH:MM:SS.mmmmmmmZ). Согласно странице Википедии ISO 8601, допустимы следующие форматы:

2017-10-18T22:33:58+00:00
2017-10-18T22:33:58Z
20171018T223358Z

PHP, вероятно, предпочитает первый. У меня была несколько похожая проблема с датами между PHP и Javascript, потому что у Javascript в конце есть конечный Z. Я закончил тем, что написал это, чтобы решить проблему:

$isoDate = date('Y-m-d\TH:i:s.000') . 'Z'; // outputs: 2017-10-18T23:04:17.000Z

ПРИМЕЧАНИЕ. Причина, по которой у меня есть 3 десятичных знака, заключается в том, что я заметил, что дата Javascript использует этот формат, возможно, вам это не нужно.

person nkh    schedule 18.10.2017