PHP计算两个日期之间的完整月数

时间:2017-10-31 20:17:32

标签: php date datetime diff

我试图计算两个日期之间的差异,但是以更具体的方式计算。

例如,我有两个日期: 2017-11-01 2018-01-31 我需要的是 3个月。这意味着,这两个日期之间有3个完整的结算月份。

这是它应该如何运作的:

  • 第1个月:2017-11-01至2017-11-30
  • 第2个月:2017-12-01至2017-12-31
  • 第3个月:2018-01-01至2018-01-31

我在DateTime类中尝试过diff方法,它产生的东西并没有多大帮助。这是一个例子

<?php
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);
print_r($diff)

result:
DateInterval Object
(
    [y] => 0
    [m] => 2
    [d] => 30
    [h] => 0
    [i] => 0
    [s] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 91
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)

显示2个月和30天。

然而,情况略有不同

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-30 00:00:00');

这两个日期之间的差异应该显示2个月和30天,而不是3个月。

非常感谢任何帮助或想法。

3 个答案:

答案 0 :(得分:2)

在进行比较之前,在结束日期添加一天。如果原始结束日期是该月的最后一天,则新的结束日期将滚动到下个月,您将在diff对象中获得正确的“完整”月数。如果原件是那一天的最后一天,则不会更改结果。

$start = '2017-11-01';
$end = '2018-01-31';

$date1 = DateTime::createFromFormat('Y-m-d', $start);
$date2 = DateTime::createFromFormat('Y-m-d', $end)->add(new DateInterval('P1D'));

echo $date1->diff($date2)->m, "\n";

答案 1 :(得分:0)

似乎你在计算过程中失去了一天。因为你需要几个月的间隔,包括第一天/最后一天 - 然后你应该把这一天添加到间隔。

所以,这种情况下的解决方案是:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 23:59:59');
$diff = $date1->diff($date2);

或:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-10-31 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-31 00:00:00');
$diff = $date1->diff($date2);

甚至:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2017-11-01 00:00:00');
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-02-01 00:00:00');
$diff = $date1->diff($date2);

答案 2 :(得分:0)

使用碳:

Carbon::parse('2017-10-31')->diffInMonths(Carbon::now());