RFC 3339如何制作日期时间

时间:2014-01-27 14:13:34

标签: php datetime google-plus rfc3339

我正在尝试格式化从谷歌加Api传递的日期,就像指南在RFC 3339格式中说的那样:

  

以下列方式公布> 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

在通过一些基本方法削减它之前,任何建议都会受到赞赏......

2 个答案:

答案 0 :(得分:7)

您无需使用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);

答案 1 :(得分:2)

有一个技巧。一个特殊的常量DATE_RFC3339是有帮助的,但是如果最后一个字符是“Z”则不起作用 - 这对于rfc3339 format来说非常好。实际上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);