RFC 3339如何从日期和时间中创建dateTime

11

我正在尝试格式化从Google Plus API传递的日期,该日期格式如RFC 3339指南所示:

  

PUBLISHED-> datetime->发布此活动的初始时间。格式为RFC 3339时间戳。

根据php文档,我发现:

  

DATE_RFC3339   与DATE_ATOM相同(自PHP 5.1.3以来)

而且这两种格式都是类似于:

  

"Y-m-d\TH:i:sP"

实际上,Google api的输出类似于:

  

2014-01-22T10:36:00.222Z

当我尝试运行命令时:

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

我一直得到FALSE的返回值。 我认为问题在最后一部分

.222Z

在采用某些粗糙的方法之前,欢迎提出任何建议...


1
或者使用标准的 date() 方法:date( DATE_RFC3339, $activity['published'] ); - MackieeE
2个回答

10

对于标准输入,您无需使用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);

6
有一个小技巧。特殊常量DATE_RFC3339被设计用来帮忙,但是如果最后一个字符是“Z”的话它就不起作用了,而这在rfc3339格式中是完全正确的。实际上,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\Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $time);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接