You need to enable JavaScript to run this app. 基于基础时段与休息时段生成日历可用时间片的实现问题
优惠活动
大模型
产品
解决方案
定价
更多

基于基础时段与休息时段生成日历可用时间片的实现问题

日历可用时间片拆分实现方案

实现逻辑

  • 时间格式转换:把所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 09:15:01