具有尾随时区的DateTime :: createFromFormat()

时间:2014-05-09 11:07:32

标签: php date datetime

我在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");

上述代码效果很好。

现在问题是我看到值0200正在针对通常来自Feed的不同输入值进行更改。并且无法找到解决这个问题的方法。

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 
  ) 
)

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

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

但问题是,如果有一个正确的方法来解决这个问题,即无需替换最后4位数并按原样使用输入并使用DateTime类来处理它?<​​/ p>

$d = new DateTime('Fri May 09 2014 11:00:00 GMT 0200');

也会将输出生成为

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

我查了这些帖子

Convert date string to UTC time with PHP

php datetime createformat parse

并没有帮助。

1 个答案:

答案 0 :(得分:2)

如果您use +而不是*,它将按预期工作。 Thsi仅适用于PHP版本&gt; = 5.3.9。它仍会生成一个警告(领主知道为什么,因为你明确允许尾随数据)但它并没有导致解析例程完全失败,至少它只是一个内部警告而不是一个真正的PHP警告。

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

  

直到下一个分隔符或数字

的随机字节

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