11

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

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

所以通过php文档我发现:

DATE_RFC3339 与 DATE_ATOM 相同(自 PHP 5.1.3 起)

这两种格式都类似于:

"Ymd\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

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

4

2 回答 2

9

您不需要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);
于 2014-01-27T14:21:05.457 回答
5

有个窍门。制作了一个特殊的常量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

这就是为什么我们需要手动指定格式:

使用日期时间

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

含碳:

\Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.u\Z', $time);
于 2016-12-21T04:04:31.447 回答