基于基础时段与休息时段生成日历可用时间片的实现问题
日历可用时间片拆分实现方案
实现逻辑
- 时间格式转换:把所有
HH:mm格式的时间转为当日累计分钟数,用数值计算避免字符串匹配误差 - 休息时段预处理:先对休息时段按开始时间升序排序,自动过滤超出基础时间范围的无效休息段,同时支持自动合并重叠的休息时段
- 区间拆分:从基础起始时间开始,逐个遍历排序后的休息时段,每段可用区间为「当前可用起始时间」到「休息开始时间-1分钟」,遍历完所有休息时段后,补充最后一段「最后一个休息结束时间+1分钟」到「基础结束时间」的可用区间
- 结果转换:把计算得到的分钟数转换回
HH:mm格式,组装成要求的对象结构
代码实现(JavaScript)
// 工具函数:HH:mm 转 当日分钟数 const timeToMinute = (timeStr) => { const [hour, minute] = timeStr.split(':').map(Number) return hour * 60 + minute } // 工具函数:当日分钟数 转 HH:mm const minuteToTime = (minute) => { const hour = Math.floor(minute / 60).toString().padStart(2, '0') const min = (minute % 60).toString().padStart(2, '0') return `${hour}:${min}` } // 主函数:计算可用时间片 const getAvailableTimeSlots = (baseTimeRange, restTimeList) => { // 提取基础时间的起止分钟数 const baseStart = timeToMinute(baseTimeRange[0].startTime) const baseEnd = timeToMinute(baseTimeRange[0].endTime) // 预处理休息时段:过滤无效段 + 按开始时间排序 const validRestList = restTimeList .map(item => ({ start: timeToMinute(item.startTime), end: timeToMinute(item.endTime) })) // 过滤完全在基础时间外的休息段 .filter(item => item.start < baseEnd && item.end > baseStart) // 按开始时间升序排列 .sort((a, b) => a.start - b.start) const availableSlots = [] let currentStart = baseStart for (const rest of validRestList) { const restStart = rest.start const restEnd = rest.end // 休息开始前有可用区间 if (currentStart < restStart) { availableSlots.push({ startTime: minuteToTime(currentStart), endTime: minuteToTime(restStart - 1) }) } // 更新下一段可用的起始时间为休息结束+1分钟 currentStart = Math.max(currentStart, restEnd + 1) } // 补充最后一段可用区间 if (currentStart <= baseEnd) { availableSlots.push({ startTime: minuteToTime(currentStart), endTime: minuteToTime(baseEnd) }) } return availableSlots } // 测试用例 const baseTime = [{startTime: '07:00', endTime: '21:00'}] const restList = [ {startTime: '08:00', endTime:'08:30'}, {startTime: '10:00', endTime:'10:30'}, {startTime: '12:00', endTime:'13:00'}, {startTime: '15:00', endTime:'15:30'}, {startTime: '18:00', endTime:'19:00'} ] console.log(getAvailableTimeSlots(baseTime, restList))
运行结果
运行上述测试用例,输出结果和需求完全一致:
[ {"startTime":"07:00","endTime":"07:59"}, {"startTime":"08:31","endTime":"09:59"}, {"startTime":"10:31","endTime":"11:59"}, {"startTime":"13:01","endTime":"14:59"}, {"startTime":"15:31","endTime":"17:59"}, {"startTime":"19:01","endTime":"21:00"} ]
内容的提问来源于stack exchange,提问作者Koji Ikehara
相关产品推荐
相关产品推荐

