RFC 3339 как сделать dateTime из

Я пытаюсь отформатировать дату, переданную из Api google plus, как говорится в руководстве в формате RFC 3339:

опубликовано - > datetime - > время, когда это действие было первоначально опубликовано. В виде типа timestamp в RFC 3339.

Итак, по документации php я обнаружил, что:

DATE_RFC3339 Так же, как DATE_ATOM (начиная с PHP 5.1.3)

и что оба формата что-то вроде:

"Y-m-dTH: i: sP"

На самом деле выход api Google-это что-то вроде:

2014-01-22T10:36: 00.222 Z

когда я пытаюсь запустить команду типа:

$date = DateTime::createFromFormat("Y-m-dTH:i:sP", $activity['published']); //$activity['published'] contain the  date

Я всегда FALSE Как вернуть. На мой взгляд, проблема в заключительной части

.222Z

любое предложение будет оценено перед резать его некоторым рудиментарным подходом...

2 ответов


вам не нужно использовать DateTime::createFromFormat() для стандартных входов. Просто используйте:

$date = new DateTime('2014-01-22T10:36:00.222Z');
var_dump($date);

но если вы все еще настаиваете на использовании createFromFormat (), используйте правильный формат с микросекундами:

$date = DateTime::createFromFormat('Y-m-d\TH:i:s.uP', '2014-01-22T10:36:00.222Z');
var_dump($date);

есть трюк. Существует специальная константа DATE_RFC3339 ment, чтобы помочь, но он не работает, если последний символ "Z" - что отлично подходит для . На самом деле JSON будет указывать такой формат:

expected format YYYY-MM-DDThh:mm:ssZ or YYYY-MM-DDThh:mm:ss+hh:mm

но с помощью этого DATE_RFC3339 вы можете получить сообщение об ошибке от PHP:

InvalidArgumentException: The timezone could not be found in the database

вот почему нам нужно указать формат вручную:

С DateTime

$date = DateTime::createFromFormat ( 'Y-m-d\TH:i:s.u\Z' ,$time);

С Углеродом:

\Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z',$time);