PHP的date_diff函数返回错误结果

3

我试图使用 PHP 中的 date_diff() 函数来获取两个日期之间的月份数。众所周知,2019-03-01 和 2020-01-31 之间的月份数为 11 个月,但以下代码返回 10 个月。

$date1=date_create("2019-03-01");
$date2=date_create("2020-01-31");
$diff=date_diff($date1,$date2);
echo $diff->format("%m months");

输出

10 months

为什么这段代码会返回少一个月的时间?


1
可能是因为实际持续时间为10个月30天,但您只显示了“月”部分。 echo $diff->format("%m个月%d天"); - showdev
但为什么它会返回这样的结果? - Shijin TR
因为它不是完整的11个月。 - showdev
2020-01-31被视为2020-01-31 00:00:00,而2019-03-01被视为2019-03-01 00:00:00。这是原因吗? - Shijin TR
那是正确的。 - showdev
2个回答

3

如果需要计算从第一天开始到最后一天午夜的月份差异,你可以将结束日期设置为午夜(24点!)或者加一天。

<?php
$dateStart = date_create("2019-03-01");
$dateEnd = date_create("2020-01-31");

//set Time to midnight or add a day
$dateEnd->setTime(24,0,0);

$diff = date_diff($dateStart,$dateEnd);
echo $diff->format("%m months");
//11 months

试试自己的代码。


是的!我之前在尝试计算日期差并使用date('now')和一个固定日期,一开始没有意识到小时数会改变日期值,现在明白了!我使用了"new DateTime('now')->setTime(0, 0)"。 - 00-BBB

2
差异为10个月30天,这就是date_diff()的返回结果。
object(DateInterval)#3 (16) {
  ["y"]=>
  int(0)
  ["m"]=>
  int(10)
  ["d"]=>
  int(30)
  ["h"]=>
  int(0)
  ["i"]=>
  int(0)
  ["s"]=>
  int(0)
  ["f"]=>
  float(0)
  ["weekday"]=>
  int(0)
  ["weekday_behavior"]=>
  int(0)
  ["first_last_day_of"]=>
  int(0)
  ["invert"]=>
  int(0)
  ["days"]=>
  int(336)
  ["special_type"]=>
  int(0)
  ["special_amount"]=>
  int(0)
  ["have_weekday_relative"]=>
  int(0)
  ["have_special_relative"]=>
  int(0)
}

正如@showdev上面评论的那样,ETA。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接