两个日期之间的十进制月份数



如何在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在评论中指出的那样,这个值永远不可能是精确的,因为月份的天数不同。

最新更新