两个日期之间的小数月数

时间:2013-12-04 21:09:53

标签: 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 = date('d', $ts1);
$day2 = date('d', $ts2);

$diff = (($year2 - $year1) * 12) + ($month2 - $month1);

但它只给了我整整几个月。我想要小数。像1.5个月或1.4个月。

3 个答案:

答案 0 :(得分:2)

首先使用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

答案 1 :(得分:0)

试试这个:

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在评论中指出的那样,这个值永远不会精确,因为几个月没有相同的天数。

答案 2 :(得分:0)

将天数除以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"

它考虑一个月中的天数,leap年等。

请记住,计算会包括时间在内,因此,如果您向$end添加24小时,则还将包括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