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

JavaScript如何正确判断两个时间范围是否存在重叠

问题原因

你当前编写的逻辑返回的是两个时间范围完全不重叠的布尔结果,如果你需要判断是否重叠,直接对原有逻辑整体取反即可,也可以直接使用正向的重叠判断逻辑,可读性更高。

正确实现

基于moment.js的实现

两个时间范围A(startA、endA)、B(startB、endB)重叠的核心判断逻辑为:A的开始时间早于B的结束时间,且A的结束时间晚于B的开始时间。

端点重合不算重叠的版本

const startA = moment(timerange1.duration.start);
const endA = moment(timerange1.duration.end);
const startB = moment(timerange2.duration.start);
const endB = moment(timerange2.duration.end);

return startA.isBefore(endB) && endA.isAfter(startB);

端点重合算重叠的版本

如果业务中认为两个时间范围首尾相接也算重叠,调整判断方法即可:

const startA = moment(timerange1.duration.start);
const endA = moment(timerange1.duration.end);
const startB = moment(timerange2.duration.start);
const endB = moment(timerange2.duration.end);

return startA.isSameOrBefore(endB) && endA.isSameOrAfter(startB);

原生JavaScript实现(无需依赖moment)

现在moment.js已经停止维护,推荐用原生Date实现:

端点重合不算重叠的版本

const startA = new Date(timerange1.duration.start);
const endA = new Date(timerange1.duration.end);
const startB = new Date(timerange2.duration.start);
const endB = new Date(timerange2.duration.end);

return startA < endB && endA > startB;

端点重合算重叠的版本

const startA = new Date(timerange1.duration.start);
const endA = new Date(timerange1.duration.end);
const startB = new Date(timerange2.duration.start);
const endB = new Date(timerange2.duration.end);

return startA <= endB && endA >= startB;
注意事项
  • 提前校验每个时间范围的结束时间大于等于开始时间,避免时间范围本身不合法导致判断错误
  • 如果timerange2.duration.end可能不存在,提前做兼容处理赋默认值,避免解析出Invalid Date导致判断异常
  • 你示例中的时间是标准UTC格式的ISO字符串,原生Date和moment都可以正常解析,无需额外格式转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:03