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