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

如何使用Carbon与Laravel正确检测预约时间是否存在冲突

预约系统重叠预约问题与解决方法

我正在开发一个预约系统,目前已有一个12:00-13:00的1小时预约。当前逻辑能阻止新预约在该时段内开始,但存在漏洞:如果用户创建11:30开始、时长2小时(13:30结束)的预约,这个预约会和已有12:00-13:00的预约重叠,却能成功创建,这不符合需求。

当前代码实现

$intervals = CarbonInterval::minutes('15')->toPeriod($start, $end);
foreach ($intervals as $time) {
    $this_time = Carbon::parse($time)->tz('Europe/Stockholm');
    $current_mission_end_from_time = Carbon::parse(roundToNearestMinuteInterval($this_time->addMinutes($current_mission_length)));

    if ($busy_between->isNotEmpty()) {
        foreach ($busy_between as $busy) {
            if ($time->between($busy['start'], $busy['end'])) {
                $busy_times->add($time->format('H:i'));
            }
        }
    }
}

空闲时间筛选逻辑

foreach ($intervals as $time) {
    if (!$busy_times->contains($time->format('H:i'))) {
        $free_times->add($time->format('H:i'));
    }
}

更新后的解决方案代码

if ($busy_between->isNotEmpty()) {
    foreach ($busy_between as $busy) {
        if ($time->between($busy['start'], $busy['end'])) {
            $busy_times->add($time->format('H:i'));
        }

        $exitingAppointment = CarbonPeriod::create($busy['start'], $busy['end']);
        $appointmentTentative = CarbonPeriod::create($time, $current_mission_end_from_time);

        if ($exitingAppointment->overlaps($appointmentTentative)) {
            $busy_times->add($time->format('H:i'));
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:06