日期时间(月)之间的差值计算函数

Function for difference calculation between datetime (months)

我的目标是计算两个日期之间的月数,包括开始月份。

我正在使用这个函数来计算。

function number_months($date1, $date2){
    $begin = new DateTime(date('Y-m-d', strtotime($date1)));
    $end = new DateTime(date('Y-m-d', strtotime($date2)));

    $diff = $end->diff($begin);
    return ($diff->format('%y') * 12) + $diff->format('%m') + 1;
}

在大多数情况下工作正常,但是当函数参数为例如:

$date1 = 2015-11-04 00:00:00
$date2 = 2017-02-01 00:00:00

函数returns:

15

应该是16。我错过了什么?我在 Whosebug 上研究过这里,尝试了提供代码的各种实现,但问题仍然存在。

谢谢。

11-04 to 12-04 = 1 month.
12-04 to 01-04 = 1 month.
01-04 to 02-01 = 0 month.
Result diff->format('%m') = 2.

($diff->format('%y') * 12) + $diff->format('%m') + 1 = 1*12 + 2 + 1 = 15; 是真的。

问题在于用户将设置项目的开始和结束日期。我需要为项目将要设置的每个月创建一个输入。所以在这种情况下我需要数字 16

感谢评论,我意识到 DateTime::diff() 在涉及年、月和日时可以使用完整的单位。

我通过将开始日期和结束日期设置为每月 1 日解决了我的问题。所以现在我的函数 returns 两个日期之间的月数,包括开始和结束月份。

function number_months($date1, $date2){
    $begin = new DateTime(date('Y-m-d', strtotime($date1)));
    $end = new DateTime(date('Y-m-d', strtotime($date2)));

    $begin->modify('first day of this month')->setTime(12, 00);
    $end->modify('first day of this month')->setTime(12, 00);

    $diff = $end->diff($begin);
    return ($diff->format('%y') * 12) + $diff->format('%m') + 1;
}