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
相关产品推荐
相关产品推荐

