You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键改动说明

  1. 总天数计算:把$d->days改成$d->days + 1,因为$d->days返回的是两个日期之间的间隔天数(比如2018-02-01到2018-02-05是4天间隔),加1后就变成了包含起始日的总天数(5天)。
  2. 天数字段调整:单独的$d->d是间隔的剩余天数,同样需要加1才能正确显示包含起始日的天数。

边界情况处理(可选优化)

如果要处理单复数的问题(比如1 day而不是1 days),可以把$days这行改成:

$days = $adjustedDays . ' day' . ($adjustedDays !== 1 ? 's' : '');

这样当只有1天的时候,会显示更自然的"1 day"。

内容的提问来源于stack exchange,提问作者Dexter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:50:13