Carbon 判断两个时间段是否有交叉
判断 两个时间段是否有交叉(重叠),核心公式其实只有一句话
A.start < B.end && A.end > B.start
只要满足这个条件,就说明两个时间段有交叉。
具体写法
假设:
use Carbon\Carbon;
$aStart = Carbon::parse('2026-02-10 10:00:00');
$aEnd = Carbon::parse('2026-02-10 12:00:00');
$bStart = Carbon::parse('2026-02-10 11:00:00');
$bEnd = Carbon::parse('2026-02-10 13:00:00');
判断:
$overlap = $aStart->lt($bEnd) && $aEnd->gt($bStart);
if ($overlap) {
echo '有交叉';
}
为什么这样判断?
图示理解:
A: |------|
B: |------|
只要:
A开始 < B结束
A结束 > B开始
一定重叠
封装成函数
function isTimeOverlap(Carbon $aStart, Carbon $aEnd, Carbon $bStart, Carbon $bEnd)
{
return $aStart->lt($bEnd) && $aEnd->gt($bStart);
}
包含边界?
比如:
A: 10:00 - 12:00
B: 12:00 - 14:00
算不算交叉?不算交叉,上面代码(lt + gt)
如果算交叉
改成:
$aStart->lte($bEnd) && $aEnd->gte($bStart);