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

如何用Carbon计算日期差,获取整数天数、小时数与分钟数?

问题

用Carbon计算两个日期差时,diffInDays()返回的是浮点数(比如测试用例里的19.404166666667),强行转int会触发“Implicit conversion from float ... loses precision”的废弃警告。需要用Carbon原生方法拿到整数的天数、小时数、分钟数,不能用浮点数凑结果。

测试用的日期:

  • 起始:2024-07-01 10:00:00
  • 结束:2024-07-20 19:42:00

原来的代码逻辑存在问题,依赖浮点数转int会触发警告:

$dateStart = Carbon::parse($dateStart);
$dateEnd = Carbon::parse($dateEnd);

if ($dateStart && $dateEnd) {
    $days = $dateStart->diffInDays($dateEnd); // 返回浮点数
    $hours = $dateStart->diffInHours($dateEnd) % 24; // 结果正确但整体逻辑依赖浮点数转换告警

    return [
        "days" => $days,
        "hours" => $hours,
    ];
}

解法1:用diff()获取DateInterval直接拆分

Carbon的diff()方法返回DateInterval对象,里面直接存储整数格式的天、小时、分钟,完全避免浮点数问题:

$dateStart = Carbon::parse('2024-07-01 10:00:00');
$dateEnd = Carbon::parse('2024-07-20 19:42:00');

if ($dateStart && $dateEnd) {
    $diff = $dateStart->diff($dateEnd);

    return [
        'days' => (int) $diff->d, // 19
        'hours' => (int) $diff->h, // 9
        'minutes' => (int) $diff->i, // 42
    ];
}

解法2:分步使用精准差值方法

先获取完整的整数天数,再基于该时间点计算剩余的小时和分钟,每一步都用Carbon原生方法保证整数结果:

$dateStart = Carbon::parse('2024-07-01 10:00:00');
$dateEnd = Carbon::parse('2024-07-20 19:42:00');

if ($dateStart && $dateEnd) {
    // 只取完整的整数天数
    $days = $dateStart->diffInDays($dateEnd, false); // 19
    // 将起始日期往后推完整天数,得到剩余时间的起始点
    $remainingStart = $dateStart->copy()->addDays($days);
    // 计算剩余的小时数
    $hours = $remainingStart->diffInHours($dateEnd, false); // 9
    // 再推小时,计算剩余分钟数
    $remainingStartAfterHours = $remainingStart->copy()->addHours($hours);
    $minutes = $remainingStartAfterHours->diffInMinutes($dateEnd, false); // 42

    return [
        'days' => $days,
        'hours' => $hours,
        'minutes' => $minutes,
    ];
}

两种解法的优势

  • 解法1最简洁,一步获取所有整数单位,完全规避浮点数相关警告。
  • 解法2适合需要分步处理剩余时间的场景,每一步都是精准的整数计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:22:03