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

Laravel Carbon计算跨天时间差异常:期望18小时却得6小时

Laravel中计算跨天时间差值(仅时间,忽略日期)的正确方法

你当前的代码问题在于:Carbon::createFromTimeString()会把两个时间默认绑定到同一天。当$this->fin(02:00)早于$this->debut(08:00)时,计算的是同一天内的时间差(实际为-6小时,diffInHours默认返回绝对值),所以得到6小时。但你需要的是把$this->fin视为次日的02:00来计算,这样差值才是18小时。

解决方法

方案一:判断时间先后,自动补全日数

$start = Carbon::createFromTimeString($this->debut);
$end = Carbon::createFromTimeString($this->fin);

// 如果结束时间早于开始时间,视为次日的时间
if ($end->lessThan($start)) {
    $end->addDay();
}

$hoursDiff = $start->diffInHours($end);

方案二:一行代码简化逻辑

$hoursDiff = Carbon::createFromTimeString($this->debut)
    ->diffInHours(
        Carbon::createFromTimeString($this->fin)->addDays(
            Carbon::createFromTimeString($this->fin)->lessThan($this->debut) ? 1 : 0
        )
    );

说明

如果你的业务逻辑中,所有结束时间早于开始时间的场景都需要按跨天处理(比如夜班时长统计),上面的逻辑完全适用。若有特殊场景,可以根据实际需求调整判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:15:36