PHP DateTime :: RFC3339_EXTENDED是否损坏?

use*_*645 7 php datetime datetime-format php-7

我似乎无法DateTime::createFromFormat()在PHP 7.0.26中工作

我的密码

date_default_timezone_set('America/New_York');

$t = '2018-02-23T11:29:16.434Z';
echo '$t: ' . json_encode($t) . PHP_EOL;
$f = DateTime::RFC3339_EXTENDED;
echo '$f: ' . json_encode($f) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;

$t = '2018-02-23T11:29:16.434+00:00';
echo '$t: ' . json_encode($t) . PHP_EOL;
echo 'createFromFormat: ' . json_encode(DateTime::createFromFormat($f, $t)) . PHP_EOL;
echo 'getLastErrors: ' . json_encode(DateTime::getLastErrors()) . PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

输出:

$t: "2018-02-23T11:29:16.434Z"
$f: "Y-m-d\\TH:i:s.vP"
createFromFormat: false
getLastErrors: {"warning_count":0,"warnings":[],"error_count":2,"errors":{"20":"The format separator does not match","21":"The timezone could not be found in the database"}}
$t: "2018-02-23T11:29:16.434+00:00"
createFromFormat: false
getLastErrors: {"warning_count":0,"warnings":[],"error_count":2,"errors":{"20":"The format separator does not match","21":"The timezone could not be found in the database"}}
Run Code Online (Sandbox Code Playgroud)

我注意到在DateTime :: createFromFormat()的format参数的值中未列出“ v” ,但据推测我应该能够使用DateTime::RFC3339_EXTENDED包含“ v” 的const 。它还说此const是在7.0版中添加的

Ale*_*hin 14

正如CBroe所说,是适合您的正确解决方案。您应该使用Y-m-d\TH:i:s.uP代替DateTime::RFC3339_EXTENDED,它是Y-m-d\TH:i:s.vP

$date = DateTime::createFromFormat("Y-m-d\TH:i:s.uP", "2018-02-23T11:29:16.434Z"); //works
Run Code Online (Sandbox Code Playgroud)

实际上,我去看看了为什么会这样,这就是我所发现的。

有一个已关闭的错误,要求以毫秒为单位支持RFC3339。错误作者创建了添加请求拉取请求。但是,尽管他RFC3339_EXTENDED为该format函数创建了一个常量,但并未添加对的支持createFromFormat。如果您在此处查看,则不支持v选项(以毫秒为单位)。是的。