如何在php中找到两个日期之间的小数月数?
我尝试了以下代码:
$date1 = '2010-01-25';
$date2 = '2010-02-20';
$ts1 = strtotime($date1);
$ts2 = strtotime($date2);
$year1 = date('Y', $ts1);
$year2 = date('Y', $ts2);
$month1 = date('m', $ts1);
$month2 = date('m', $ts2);
$day1 = date('d', $ts1);
$day2 = date('d', $ts2);
$diff = (($year2 - $year1) * 12) + ($month2 - $month1);
但这只给了我整整几个月的时间。我想要带小数的。比如1.5个月或1.4个月。
首先使用DateTime::diff
来比较您的日期。这将为您提供一个DateInterval
结果对象。
然后我会做这样的事情:
$months = ($interval->y * 12) + $interval->m; // Total number of whole months
$months += number_format($interval->d / 30, 1); // Add the month fraction
工作示例:http://3v4l.org/f6n3r
将天数除以30天是一个简单的实现。这是不可接受的敏感计算,如发票或其他财务相关的东西。
有一个很棒的DateTime
扩展名为Carbon
$start = Carbon::create(2010, 1, 25, 0, 0, 0);
$end = Carbon::create(2010, 2, 20, 0, 0, 0);
echo $start->floatDiffInMonths($end); // "0.90437788018433"
它考虑了一个月的天数、闰年和其他因素。
请记住,计算包括时间,因此如果您将24小时添加到$end
,则2010年2月20日也将包括在内:
$start = Carbon::create(2010, 1, 25, 0, 0, 0);
$end = Carbon::create(2010, 2, 20, 24, 0, 0);
echo $start->floatDiffInMonths($end); // "0.94009216589862"
它还支持不同时区的夏令时,为此,您需要使用floatDiffInRealMonths
试试这个:
function monthNb ($vStartDate,$vEndDate) // dates are of format 2013-11-27
{$vStart = strtotime($vStartDate);
$vEnd = strtotime($vEndDate);
$vDiff = abs($vEnd - $vStart); // here abs in case theres a mix in the dates
$vMonths = $vDiff / 1036800; // number of seconds in a month of 30 days
return $vMonths;}
如果所有月份都有30天的话,这将给你大致的月份差异。它真的变得非常精确,因为月份的天数并不都一样。你可以做一个自定义的动作,用结束日期所在月份的天数除以秒数,但1月结束的1.5个月与4月结束的1个月不同。要明白,正如Marc B在评论中指出的那样,这个值永远不可能是精确的,因为月份的天数不同。