实现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
相关产品推荐
相关产品推荐

