日历预约时段背景色判断优化:如何关联事件时长与时段
解决日历预约时段重叠判断问题
你的核心问题是原来的代码只检查事件的起止点是否落在目标时段内,没考虑事件完全覆盖时段的情况。要实现只要事件和目标时段有重叠就标记背景色,需要改用时间区间重叠判断逻辑。
修改思路
判断两个时间区间(事件区间[$newinizio, $newfine) 和 当前时段区间[$slotStart, $slotEnd))是否重叠的标准逻辑是:
事件开始时间 < 当前时段结束时间 并且 事件结束时间 > 当前时段开始时间
这个逻辑能覆盖所有重叠场景:事件包含时段、时段包含事件、部分重叠等。
针对你的代码修改
假设你要处理的是8:30-9:00这个时段(对应变量$ore830和$ore9),代码可以改成这样:
// 定义当前时段的起止时间 $slotStart = $ore830; $slotEnd = $ore9; // 统计与当前时段重叠的事件数量 $overlappingCount = 0; // 遍历所有事件(假设你的事件存储在$events数组中) foreach ($events as $event) { $eventStart = $event['newinizio']; $eventEnd = $event['newfine']; // 判断当前事件是否和时段重叠 if (($eventStart < $slotEnd) && ($eventEnd > $slotStart)) { $overlappingCount++; } } // 根据重叠数量设置背景色 if ($overlappingCount == 1) { $bg830 = 'yellow'; } elseif ($overlappingCount >= 2) { $bg830 = 'red'; }
为什么原来的逻辑失效
你原来的代码$newinizio >= $ore8 && $newinizio <= $ore830 || $newfine >= $ore8 && $newfine <= $ore830只判断事件的起点或终点落在当前时段内,但像8:00-9:10这样的事件,起点在8:30之前、终点在9:00之后,完全覆盖了8:30-9:00时段,原来的条件就不会触发,所以按钮不会变色。而新的重叠判断逻辑能覆盖这种情况。
内容的提问来源于stack exchange,提问作者Mr. H
相关产品推荐
相关产品推荐

