2014-05-09 56 views
1

我面临着一些奇怪的问题与DateTime::createFromFormat()日期时间:: 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正在改变通常来自一个饲料的不同输入值。并找不到处理这个问题的方法。

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类来处理它?

$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

,并没有帮助。

回答

2

如果你use +而不是*,它会按需要工作。这只适用于PHP版本> = 5.3.9。它仍然会产生一个警告(阁下知道为什么,因为你明确允许尾随数据),但它不会导致解析例程彻底失败,至少它只是一个内部警告而不是实际的PHP警告。

是什么原因导致*失败是允许(重点煤矿):

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

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

+0

啊,我看到我的服务器是在PHP5.3上,也许当我用+ +它也没有产生任何转换日期。刚试过不同的机器,似乎工作,但是,警告仍然存在。感谢您的答案,我几乎要疯了,甚至不知道在PHP 5.3不起作用,并在5.3.9它与隐藏的警告。我会接受答案。你介意指定版本差异可能会导致这个问题到你的答案,以便别人不必像我这样的头撞:) –

+0

是的,现在我再次读取3v4l输出它看起来像这是直到5.3.9的错误。我会更新这个答案 - 你应该真的升级你的服务器,5.3现在是EOL ;-) – DaveRandom

+0

是的,我马上升级看起来像在Debian的分发包是最新的一个喘气,所以升级PHP。不确定旧版本的PHP如何在debian上做。无论如何,再次感谢。 –