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

