【问题标题】:PHP DateTime, parsing string date failsPHP DateTime,解析字符串日期失败
【发布时间】:2014-02-11 00:17:21
【问题描述】:

我将 startDate end 和 endDate 作为获取请求参数传递给方法, 在这里他们被解析为:

$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 的实例,它会返回

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不代表同一个Date

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

更新:

我尝试使用 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 

我也试过了:

    $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-01-21 12:28:57)

我只是不明白。

任何帮助,在此先感谢!

【问题讨论】:

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

标签: php string date datetime


【解决方案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()静态方法根据具体格式返回DateTime对象。

demo

【讨论】:

  • 非常感谢,有没有办法操纵日期字符串,所以它可以被解析?不幸的是,我无法在传递给该方法之前更改 dateString,或者“createFromFormat()”如何查找我的情况?对不起,我是一个完整的新手,有日期
  • @johnSmith:就像我说的,使用DateTime::createFromFormat()。我还给你演示了...
  • 嗯,我真的不明白
  • @johnSmith:你甚至不能复制/粘贴我的演示?您在哪里看到我使用 DateTime 对象作为第一个参数创建 DateTime 对象?静态方法DateTime::createFromFormat() 已经创建对象,如果您有有效的格式或输入,否则返回falseCan you see your mistake on this demo?
【解决方案2】:

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

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

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

【讨论】:

  • 嘿,谢谢。我怎样才能做到这一点 ?在 DateString 进入方法之前,我无法更改它。我用 createFromFormat 尝试了一些东西,但是没有用,你有什么想法吗?
  • 您应该在发送应用程序中更改此设置。你能控制发件人吗?也许你给我们一些关于发件人的更多信息?在解析日期字符串之前,我不会尝试修改它,这只会导致更多问题。经验法则是,如果 PHP 不能解析你的日期,你也不应该。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
相关资源
最近更新 更多