php - 这是 PHP 的 DateTime :diff? 中的错误吗

标签 php datetime date time date-math

>> $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-20121-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/

相关文章:

php - 如何通过codeigniter在mysql中插入多选下拉值( View -> Controller ->模型)

c# - 在 C# 中获取系统可空日期时间(日期时间?)的短日期

PHP获取月份的周数

javascript - Moment.js - 如何将日期字符串转换为日期?

php - 如何从另一个 div 中获得相同的、只是随机播放的内容

php - PHP 与 C 中的箭头运算符

python - 在 Python 中将 1999 年 1 月 1 日以来的秒数转换为 UTC 日期/时间

python - 如何在Python中对每月最后一周的金额字段求和?

java - Java 1.4 中的当前日期

php - MySQL 分隔为 DIV 元素