基于Google日历的预约调度系统:如何识别可预订30分钟连续时段?
检测可预订30分钟连续时段的实现方案
背景
开发对接多Google日历的预约调度系统,已将每日9:00-18:00划分为10分钟间隔的时段(slot),生成包含时段时间及可用状态的数组,需筛选出**连续3个可用状态为yes**的时段,提取这些连续时段的开始时间供用户预订。
实现思路
- 遍历时段数组,维护计数器跟踪当前连续可用的slot数量
- 遇到
available为yes时计数器递增,遇到no时重置计数器 - 当计数器达到3及以上时,记录当前连续序列中可作为30分钟预约起始点的时段(即当前slot往前数第2个slot的时间)
- 去重整理结果,得到所有符合条件的预约开始时间
代码示例(PHP)
// 原始时段数组 $slots = [ ['slot' => '2024-01-01 09:00:00', 'available' => 'no'], ['slot' => '2024-01-01 09:10:00', 'available' => 'no'], ['slot' => '2024-01-01 09:20:00', 'available' => 'no'], ['slot' => '2024-01-01 09:30:00', 'available' => 'no'], ['slot' => '2024-01-01 09:40:00', 'available' => 'no'], ['slot' => '2024-01-01 09:50:00', 'available' => 'no'], ['slot' => '2024-01-01 10:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 10:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 10:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 10:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 10:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 10:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 11:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 12:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 13:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 14:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 15:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 16:00:00', 'available' => 'no'], ['slot' => '2024-01-01 16:10:00', 'available' => 'no'], ['slot' => '2024-01-01 16:20:00', 'available' => 'no'], ['slot' => '2024-01-01 16:30:00', 'available' => 'no'], ['slot' => '2024-01-01 16:40:00', 'available' => 'no'], ['slot' => '2024-01-01 16:50:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:00:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:10:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:20:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:30:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:40:00', 'available' => 'yes'], ['slot' => '2024-01-01 17:50:00', 'available' => 'yes'] ]; $availableStartTimes = []; $consecutiveYes = 0; foreach ($slots as $index => $slot) { if ($slot['available'] === 'yes') { $consecutiveYes++; // 连续可用数达标时,记录对应起始时段 if ($consecutiveYes >= 3) { $startSlot = $slots[$index - 2]; $availableStartTimes[] = $startSlot['slot']; } } else { $consecutiveYes = 0; } } // 去重确保每个起始时间唯一 $availableStartTimes = array_unique($availableStartTimes); // 输出符合条件的预约起始时间 print_r($availableStartTimes);
结果说明
运行代码后,$availableStartTimes数组将包含所有可预订的30分钟时段起始点,例如:
2024-01-01 10:00:00(对应10:00-10:30)2024-01-01 10:10:00(对应10:10-10:40)- ...
2024-01-01 15:30:00(对应15:30-16:00)2024-01-01 16:50:00(对应16:50-17:20)
这些时间可直接展示给用户选择预订。
内容的提问来源于stack exchange,提问作者freshwebs
相关产品推荐
相关产品推荐

