首页 > 解决方案 > DateTime::createFromFormat 不工作 (PHP 7.2)

问题描述

嗨,

我在创建 DateTime 对象时遇到了一些问题:

DateTime::createFromFormat(DateTime::RFC3339_EXTENDED, '2018-07-30T20:03:25.000+02:00')

或者这样:

DateTime::createFromFormat(DateTime::RFC3339_EXTENDED, '2018-07-30T20:03:25.000+02:00', $ev = new DateTimeZone('Europe/Vienna'))

这是我在这两种情况下得到的错误:

"errors" => array:2 [▼
20 => "The format separator does not match"
21 => "The timezone could not be found in the database"]

有人建议我做错了什么?

谢谢!

标签: php

解决方案


DateTime::createFromFormat不幸的是,不支持所有 PHP 的日期格式字符,包括v毫秒。RFC3339_EXTENDED解析为Ymd\TH:i:s.vP,其中包含此字符 - 其效果是该常量不能用于解析日期,只能用于显示它们。

一种解决方法是使用包含u格式字符(微秒)的手动格式字符串,如下所示:

$d = DateTime::createFromFormat('Y-m-d\TH:i:s.uP', '2018-07-30T20:03:25.000+02:00');
echo $d->format('Y-m-d H:i:s');
// 2018-07-30 20:03:25

注意:显然这意味着微秒值将比它应该的值小 1000 倍 - 如果这个粒度级别很重要,那么你需要在返回对象的路上将它乘以 1000。

编辑:解析v使其成为 PHP 7.3


推荐阅读