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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:39:01