我的目标是计算两个日期(包括起始月份)之间的月数。
我正在使用此功能进行计算。
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
函数返回:
15
应为16
。我错过了什么?我在这里研究了Stackoverflow,尝试了各种提供代码的实现,但问题仍然存在。
感谢。
答案 0 :(得分:0)
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->格式('%y')* 12)+ $ diff->格式('%m')+ 1 = 1 * 12 + 2 + 1 = 15; 这是真的。
答案 1 :(得分:0)
问题是用户将设置项目的开始和结束日期。我需要为项目的每个月创建一个输入。所以在这种情况下我需要数字16
。
感谢评论,我意识到DateTime::diff()
在几年,几个月和几天内以完整单位运作。
我通过将开始和结束日期设置为月份的第1天来解决了我的问题。所以现在我的函数返回两个日期之间的月份数,包括开始和结束月份。
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;
}