>> $start_dt = new DateTime()
DateTime::__set_state(array(
'date' => '2012-04-11 08:34:01',
'timezone_type' => 3,
'timezone' => 'America/Los_Angeles',
))
>> $end_dt = new DateTime()
DateTime::__set_state(array(
'date' => '2012-04-11 08:34:06',
'timezone_type' => 3,
'timezone' => 'America/Los_Angeles',
))
>> $start_dt->setTimestamp(strtotime('31-Jan-2012'))
DateTime::__set_state(array(
'date' => '2012-01-31 00:00:00',
'timezone_type' => 3,
'timezone' => 'America/Los_Angeles',
))
>> $end_dt->setTimestamp(strtotime('1-Mar-2012'))
DateTime::__set_state(array(
'date' => '2012-03-01 00:00:00',
'timezone_type' => 3,
'timezone' => 'America/Los_Angeles',
))
>> $interval = $start_dt->diff($end_dt)
DateInterval::__set_state(array(
'y' => 0,
'm' => 0,
'd' => 30,
'h' => 0,
'i' => 0,
's' => 0,
'invert' => 0,
'days' => 30,
))
>> $interval->format('%mm %dd')
'0m 30d'
即 31-Jan-2012
到 1-Mar-2012
不到一个月的时间!我希望输出为 1 个月零 1 天。二月的天数应该无关紧要;这就是使用时间库的意义所在——它应该处理这些事情。 WolframAlpha agrees .
我应该向 PHP 提交错误吗?是否有黑客/修复/变通方法可以让几个月的时间按预期工作?
最佳答案
更新的答案
DateTime::diff
的这种行为当然是出乎意料的,但这不是错误。简而言之,diff
返回年、月、日等,如果您这样做了
$end_ts = strtotime('+$y years +$m months +$d days' /* etc */, $start_ts);
您将取回与结束原始结束日期相对应的时间戳。
这些添加是“盲目”执行的,然后应用日期更正(例如,1 月 31 日 + 1 个月将是 2 月 31 日,根据年份更正为 3 月 2 日或 3 月 3 日)。在此特定示例中,您甚至不能添加一个月,正如 salathe 也解释的那样。
关于php - 这是 PHP 的 DateTime :diff? 中的错误吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10109323/