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

Php 两个日期之间的十进制月数,php,Php,如何在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 = d

如何在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个月

首先,使用比较日期。这将为您提供一个结果对象

然后我会这样做:

$months = ($interval->y * 12) + $interval->m; // Total number of whole months
$months += number_format($interval->d / 30, 1); // Add the month fraction
工作示例:

尝试以下操作:

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,5个月并不相同。要明白,正如Marc B在他的评论中指出的那样,这个值永远不可能精确,因为月份的天数并不相同。

将天数除以30天是一个简单的实现。不接受敏感计算,如发票或其他财务相关内容

有一个很棒的
DateTime
扩展名

它考虑了一个月的天数、闰年和其他因素

请记住,计算包括时间在内,因此如果您将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"

它还支持不同时区的夏令时,因此,如果您有2010-11-01和2011-01-02,您需要使用
floatDiffinrealmounts

,然后获取剩余天数并除以30永不工作。你最终会做
1-11
,结果是负10个月。。。加上<代码>1.5个月?月份是不能用小数来表示的。二月->三月是一个月,但只有28天(或29天)…不太合适,因为这假设每个月都有30天。@Fran这是正确的。我们以多个月为间隔,你必须使用平均月长来估计分数部分。除非你想发布另一个解决方案?
$start = Carbon::create(2010, 1, 25, 0, 0, 0);
$end = Carbon::create(2010, 2, 20, 24, 0, 0);

echo $start->floatDiffInMonths($end); // "0.94009216589862"