2014-01-21 59 views
1

IM传递的startDate结束的结束日期作为GET请求参数的方法, 这里他们得到解析,如:PHP日期时间,解析字符串日期失败

$startDate=$request->query->get('start'); 
$endDate=$request->query->get('end'); 
$logger->info('startdate is :'.$startDate.', endDate is : '.$endDate.''); 

$start=new \DateTime($startDate); 
$end=new \DateTime($endDate); 

当我登录这两个参数,它们可能是

startdate is: Wed Jan 12 2011 00:00:00 GMT 0100 (CET) 

startDate is: Sat Jan 12 2013 00:00:00 GMT 0100 (CET) 

到目前为止好,但如果我登录从字符串实例化的DateTime's上述返回

DateTime Object ([date] => 0100-01-12 00:00:00 [timezone_type] => 2 [timezone] => GMT) 

DateTime Object ([date] => 0100-01-15 00:00:00 [timezone_type] => 2 [timezone] => GMT) 

你可以看到,DateTime不代表相同的日期

我可以从这些字符串中生成一个有效的DateTime吗?

更新:

我tryed使用createFromFormat

$startDate=$request->query->get('start'); 
    $endDate=$request->query->get('end'); 

    $start=new \DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$startDate); 
    $end=new \DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$endDate); 

但导致异常:

FatalErrorException: Parse: syntax error, unexpected 'createFromFormat' (T_STRING), expecting variable (T_VARIABLE) or '$' in 

我也tryed:

$start=new \DateTime(\DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$startDate)); 
    $end=new \DateTime(\DateTime::createFromFormat('D M d Y h:i:s e+O (T)',$endDate)); 

但是,从现在(2014年1月21日12时28分57秒)创建日期新的日期

我只是不得到它的权利。

任何帮助,在此先感谢!

+0

只是为了文档,总是修剪你的时间戳。我使用'DateTime :: createFromFormat()'时,最后有一个空格,并且出现错误。 –

回答

1

您的输入日期时间字符串Wed Jan 12 2011 00:00:00 GMT 0100 (CET)DateTime()strtotime()中无效/标准。见date_parse()函数来查看你的时间字符串是如何被解析:

print_r(date_parse('Wed Jan 12 2011 00:00:00 GMT 0100 (CET)')); 

demo

使用DateTime::createFromFormat()静态方法来根据具体的格式返回日期对象。

demo

+0

非常感谢,有没有办法操纵日期字符串,所以它可以被解析?不幸的是我不能改变dateString之前传入该方法,或者“createFromFormat()”如何查找我的情况?对不起,我有一个完整的新手日期 –

+0

@johnSmith:就像我说的,使用'DateTime :: createFromFormat()'。我也给你一个演示... –

+0

我tryed和更新我的问题,我做什么错了? –

1

您可能使用的日期格式是RFC2822。如PHP date()页所示: 2000年12月21日星期四16:01:07 +0200

您切换了月份和日期部分,PHP无法确定正确的部分。

最佳做法是使用Unix时间戳(Epoch后的秒数)或更好的格式,如ISO 8601(2004-02-12T15:19:21 + 00:00)。

+0

嘿,谢谢。我怎样才能做到这一点 ?在进入方法之前,我无法更改DateString。我尝试了一些与createFromFormat的东西,但不起作用,你有一个想法? –

+0

你应该改变你的发送应用程序。你可以控制发件人吗?也许你给我们一些关于发件人的更多信息? 我不会在解析它之前尝试修改日期字符串,这只会导致更多的问题。经验法则是,如果PHP不能解析你的日期,你也不应该。 – ToBe