【问题标题】:PHP date_diff function returns wrong resultPHP date_diff 函数返回错误结果
【发布时间】:2020-02-26 19:08:54
【问题描述】:

我试图在 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 months %d days");
  • 但为什么会这样返回?
  • 因为还不到11个月。
  • 2020-01-31 被视为 2020-01-31 00:00:00 和 2019-03-01 被视为 2019-03-01 00:00:00 。是这个原因吗?
  • 没错。

标签: php date datediff


【解决方案1】:

如果您需要从第一天开始到最后一天午夜结束的月份差异,您还可以将结束日期设置为午夜(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

try self.

【讨论】:

  • 是的!我试图获得天数差异并使用 date('now') 与设定日期相比,起初并没有意识到小时数正在改变天数,这是有道理的!我使用了“new DateTime('now')->setTime(0, 0)”
【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2018-05-04
    • 2013-01-11
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多