3 回答
![?](http://img1.sycdn.imooc.com/54584ef20001deba02200220-100-100.jpg)
TA贡献1865条经验 获得超7个赞
这是一个快速的:
$date1 = mktime(0,0,0,10,0,2003); // m d y, use 0 for day
$date2 = mktime(0,0,0,3,0,2004); // m d y, use 0 for day
echo round(($date2-$date1) / 60 / 60 / 24 / 30);
![?](http://img1.sycdn.imooc.com/533e4c5600017c5b02010200-100-100.jpg)
TA贡献1966条经验 获得超4个赞
在测试了大量解决方案之后,将其全部进行单元测试,这就是我得出的结果:
/**
* Calculate the difference in months between two dates (v1 / 18.11.2013)
*
* @param \DateTime $date1
* @param \DateTime $date2
* @return int
*/
public static function diffInMonths(\DateTime $date1, \DateTime $date2)
{
$diff = $date1->diff($date2);
$months = $diff->y * 12 + $diff->m + $diff->d / 30;
return (int) round($months);
}
例如,它将返回(来自单元测试的测试用例):
01.11.2013-30.11.2013-1个月
2013年1月1日-2013年12月31日-12个月
31.01.2011-28.02.2011-1个月
01.09.2009-01.05.2010-8个月
01.01.2013-31.03.2013-3个月
15.02.2013-15.04.2013-2个月
1985年2月1日-2013年12月31日-347个月
注意:由于四舍五入是与日期进行舍入,因此即使是半个月也将被舍入,如果在某些情况下使用它可能会导致问题。因此,请勿在这种情况下使用它,否则会导致问题。
例如:
2013年11月2日-2013年12月31日将返回2,而不是1(符合预期)。
- 3 回答
- 0 关注
- 442 浏览
添加回答
举报