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

实现calculateIsBetween函数判断休息时段是否均落在工作时段范围内

实现方案

实现思路

  • 第一步:将所有HH:MM格式的时间转换为当日0点开始的分钟数(取值范围0~1439),简化数值比较逻辑
  • 第二步:单独封装时段包含判断逻辑,同时兼容父/子时段跨午夜的场景
  • 第三步:遍历所有休息时段,只要存在任意一个休息时段未被任何工作时段包含,直接返回false,全部匹配则返回true

完整代码

// 时间转分钟数工具函数
function timeToMinutes(timeStr) {
  const [hours, minutes] = timeStr.split(':').map(Number);
  return hours * 60 + minutes;
}

// 判断子时段是否完全被父时段包含
function isSubPeriodInParent(subStart, subEnd, parentStart, parentEnd) {
  // 父时段不跨午夜
  if (parentStart < parentEnd) {
    // 子时段也不能跨午夜,且起止都在父时段范围内
    return subStart < subEnd && subStart >= parentStart && subEnd <= parentEnd;
  }
  // 父时段跨午夜场景
  if (subStart < subEnd) {
    // 子时段不跨午夜:要么全在「父起点-24点」区间,要么全在「0点-父终点」区间
    return (subStart >= parentStart && subEnd <= 1440) || (subStart >= 0 && subEnd <= parentEnd);
  } else {
    // 子时段也跨午夜:只要子起点>=父起点、子终点<=父终点即为包含
    return subStart >= parentStart && subEnd <= parentEnd;
  }
}

function calculateIsBetween(workTimes, breakTimes) {
  // 预解析所有工作时段为分钟格式,避免重复计算
  const parsedWork = workTimes.map(item => ({
    start: timeToMinutes(item.entryTime),
    end: timeToMinutes(item.exitTime)
  }));
  // 逐个校验休息时段
  for (const breakItem of breakTimes) {
    const breakStart = timeToMinutes(breakItem.startBreak);
    const breakEnd = timeToMinutes(breakItem.endBreak);
    // 检查是否有任意一个工作时段包含当前休息时段
    const hasMatch = parsedWork.some(work => {
      return isSubPeriodInParent(breakStart, breakEnd, work.start, work.end);
    });
    if (!hasMatch) return false;
  }
  return true;
}

测试验证

// 示例1
const work1 = [{entryTime: '12:00', exitTime: '13:00'},{entryTime: '14:00', exitTime: '15:00'}];
const break1 = [{startBreak: '12:05', endBreak: '12:10'},{startBreak: '12:25', endBreak: '12:30'}];
console.log(calculateIsBetween(work1, break1)); // 输出true

// 示例2
const break2 = [{startBreak: '16:05', endBreak: '18:10'},{startBreak: '12:25', endBreak: '12:30'}];
console.log(calculateIsBetween(work1, break2)); // 输出false

// 跨午夜场景测试
const work3 = [{entryTime: '22:00', exitTime: '06:00'}];
const break3 = [{startBreak: '23:30', endBreak: '00:30'}];
console.log(calculateIsBetween(work3, break3)); // 输出true

const break4 = [{startBreak: '05:00', endBreak: '07:00'}];
console.log(calculateIsBetween(work3, break4)); // 输出false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:03