【问题标题】:Is PHP DateTime::RFC3339_EXTENDED broken?PHP DateTime::RFC3339_EXTENDED 坏了吗?
【发布时间】:2018-08-03 13:22:39
【问题描述】:

我似乎无法让 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;

输出:

$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"}}

我注意到“v”未列在DateTime::createFromFormat() 的格式参数值中——但据说我应该能够使用包含“v”的 const DateTime::RFC3339_EXTENDED。它还说this const was added in version 7.0

【问题讨论】:

  • @CBroe - 不,我没有看到它在页面下方。谢谢 - 将其作为答案,以便我接受。
  • 对亚历克斯的回答很满意,他甚至更多地研究了细节,所以你不妨接受那个;-)
  • 是的。 “v”部分甚至不在文档中,因此无法解析回来。它似乎应该是“你”。去图吧。

标签: php datetime php-7 datetime-format


【解决方案1】:

正如 CBroe 所说,this 是适合您的解决方案。您应该使用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

我实际上是去看看为什么会发生这种情况,这就是我发现的。

有一个closed bug 请求支持以毫秒为单位的 RFC3339。错误作者创建了一个pull request 来添加此功能。但是,虽然他为format 函数创建了一个RFC3339_EXTENDED 常量,但他没有添加对createFromFormat 的支持。如果您查看here,则不支持v 选项(以毫秒为单位)。是的。

【讨论】:

    【解决方案2】:

    是的,显然它只在 PHP 7.3.0 中得到修复,请参阅https://3v4l.org/4nMi4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-30
      • 2010-11-21
      • 2021-12-31
      • 2015-03-04
      • 2016-09-08
      • 2011-07-14
      • 2020-09-01
      相关资源
      最近更新 更多