PHP中使用date->diff计算日期差时如何包含起始日期
解决PHP DateTime::diff()忽略起始日期的问题
我太懂这个痛点了——默认的diff()方法计算的是两个日期之间的间隔天数,自然会把起始日排除在外。要让统计包含第一天,其实只需要简单调整计算逻辑就行,我给你改好代码,顺便解释下细节:
修改后的代码
$d1 = '2018-02-01 00:00:00'; $d2 = '2018-02-05 00:00:00'; function timeDifference($dT1, $dT2){ $d1 = new DateTime($dT1); $d2 = new DateTime($dT2); $d = $d1->diff($d2); // 核心修改:总天数+1,包含起始日 $total = $d->days + 1; // 单独的天数字段也要+1,对应显示包含起始日的天数 $adjustedDays = $d->d + 1; $month = $d->m.' months'; $days = $adjustedDays.' days'; if ($total > 30) { $returnDate = $month.' '.$days; } else { $returnDate = $days; } return $returnDate; } echo timeDifference($d1, $d2); // 现在输出:5 days
关键改动说明
- 总天数计算:把
$d->days改成$d->days + 1,因为$d->days返回的是两个日期之间的间隔天数(比如2018-02-01到2018-02-05是4天间隔),加1后就变成了包含起始日的总天数(5天)。 - 天数字段调整:单独的
$d->d是间隔的剩余天数,同样需要加1才能正确显示包含起始日的天数。
边界情况处理(可选优化)
如果要处理单复数的问题(比如1 day而不是1 days),可以把$days这行改成:
$days = $adjustedDays . ' day' . ($adjustedDays !== 1 ? 's' : '');
这样当只有1天的时候,会显示更自然的"1 day"。
内容的提问来源于stack exchange,提问作者Dexter
相关产品推荐
相关产品推荐

