DateTime::createFromFormat() 带有尾随时区

Abh*_*rty 1 php datetime date

我遇到了DateTime::createFromFormat()的一些奇怪问题

我有一个输入日期

2014 年 5 月 9 日星期五 11:00:00 GMT 0200

现在,当我在其上应用 DateTime::createFromFormat() 时,它似乎不起作用。

所以我做了什么

$d = DateTime::createFromFormat('D M m Y H:i:s T 0200', 'Fri May 09 2014 11:00:00 GMT 0200');
echo $d->format("Y-m-d H:i:s");
Run Code Online (Sandbox Code Playgroud)

上面的代码运行良好。

现在的问题是我看到值 0200 正在随着通常来自提要的不同输入值而变化。并且找不到解决这个问题的方法。

http://php.net/manual/en/datetime.createfromformat.php

在手册中它支持在末尾添加 + , * 但这会出现错误

所以

$d = DateTime::createFromFormat('D M m Y H:i:s T *', 'Fri May 09 2014 11:00:00 GMT 0200');
Array 
( 
  [warning_count] => 0 
  [warnings] => Array ( ) 
  [error_count] => 1 
  [errors] => Array ( 
     [30] => Trailing data 
  ) 
)
Run Code Online (Sandbox Code Playgroud)

我正在做的工作是删除最后 4 位数字,然后使用以下形式

$d = DateTime::createFromFormat('D M m Y H:i:s T', 'Fri May 09 2014 11:00:00 GMT');
Run Code Online (Sandbox Code Playgroud)

但问题是,是否有一种正确的方法来处理这个问题,即不必替换最后 4 位数字并按原样使用输入并使用 DateTime 类来处理它?

$d = new DateTime('Fri May 09 2014 11:00:00 GMT 0200');
Run Code Online (Sandbox Code Playgroud)

还产生输出为

DateTime Object 
( 
  [date] => 0200-05-15 11:00:00 
  [timezone_type] => 2 
  [timezone] => GMT 
) 
Run Code Online (Sandbox Code Playgroud)

我检查了这些帖子

使用 PHP 将日期字符串转换为 UTC 时间

php 日期时间创建格式解析

并没有帮助。

Dav*_*dom 5

如果您使用+而不是*,它将按预期工作。这只适用于 PHP 版本 >=5.3.9。它仍然会生成一个警告(上帝知道为什么,因为您明确允许跟踪数据)但它不会导致解析例程彻底失败,至少它只是一个内部警告而不是实际的 PHP 警告。

导致失败的原因*是它允许(强调我的):

随机字节直到下一个分隔符或数字

由于尾随数据都是数字,因此*解析会立即返回,不会消耗任何字符,从而将字符串指针保留在末尾仍有尾随字节的位置。