使用moment.js过滤与预约重叠的可选工作时段结果出错如何解决
问题原因分析
- 比较精度错误:调用
isSameOrAfter、isSameOrBefore时传入的第二个参数"hour"代表仅按小时维度对比,忽略了分钟级差异,和你5分钟间隔的时段判断需求不匹配,需删除该参数使用默认的毫秒级精度。 - 重叠判断逻辑错误:原有
isBusyHours仅能识别「预约完全包含在可选时段内」的情况,实际只要两个时段存在任意交集就属于需要排除的繁忙时段。 - 数组方法逻辑倒置:你需要保留「和所有预约都不重叠」的时段,应该用
every方法判断所有预约都不满足重叠条件,原有some只要存在一个符合条件的预约就返回,逻辑完全相反。
正确实现代码
const optionalWorkingHours = [ { from: "05:00", to: "05:05" }, { from: "05:05", to: "05:10" }, { from: "05:10", to: "05:15" }, { from: "05:15", to: "05:20" }, // 其余时段省略 ]; const appointments = [ { from: "05:00", to: "05:05" }, { from: "05:30", to: "06:00" }, { from: "07:50", to: "08:00" } ]; const availableHours = optionalWorkingHours.filter((o) => { const optionalFrom = moment(o.from, "HH:mm"); const optionalTo = moment(o.to, "HH:mm"); // 仅保留和所有预约都不重叠的时段 return appointments.every((c) => { const currentFrom = moment(c.from, "HH:mm"); const currentTo = moment(c.to, "HH:mm"); // 不重叠的判定条件:可选时段结束早等于预约开始,或可选时段开始晚等于预约结束 return optionalTo.isSameOrBefore(currentFrom) || optionalFrom.isSameOrAfter(currentTo); }); });
效果验证
以上代码运行后,会自动过滤所有和预约存在重叠的可选时段,最终返回的availableHours仅包含完全空闲的工作时段,不会出现错误返回重叠时段、疑似重复的问题。
内容的提问来源于stack exchange,提问作者Netanel Vaknin
相关产品推荐
相关产品推荐

