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

如何在TypeScript中检测日期区间重叠(尽量避免多重迭代)

优雅验证日期区间无重叠的实现方案

核心思路

先将数组按区间的起始日期升序排序,之后只需检查相邻区间是否重叠即可。排序后若存在重叠区间,必然会出现相邻的两个区间重叠的情况,这种方法将时间复杂度从暴力解法的O(n²)降到O(n log n)(主要开销来自排序),代码简洁且高效,完全适配10-20个元素的规模。

具体实现(TypeScript)

// 定义区间类型
type DateRange = { startDate: Date; endDate: Date };

function hasOverlappingRanges(dateArray: DateRange[]): boolean {
    // 空数组或单个元素直接判定无重叠
    if (dateArray.length <= 1) return false;

    // 按起始日期升序排序,用时间戳比较避免Date对象直接对比的问题
    const sortedRanges = [...dateArray].sort((a, b) => a.startDate.getTime() - b.startDate.getTime());

    // 遍历检查相邻区间
    for (let i = 1; i < sortedRanges.length; i++) {
        const prevEnd = sortedRanges[i-1].endDate.getTime();
        const currentStart = sortedRanges[i].startDate.getTime();
        // 当前区间起始早于前一个区间结束,判定重叠
        if (currentStart < prevEnd) {
            return true;
        }
    }

    // 所有相邻区间均无重叠
    return false;
}

// 测试示例
const validRanges: DateRange[] = [
    { startDate: new Date('2022-09-05'), endDate: new Date('2022-09-23') },
    { startDate: new Date('2022-10-01'), endDate: new Date('2022-10-31') }
];
console.log(hasOverlappingRanges(validRanges)); // 输出: false

const invalidRanges: DateRange[] = [
    ...validRanges,
    { startDate: new Date('2022-10-21'), endDate: new Date('2022-11-14') }
];
console.log(hasOverlappingRanges(invalidRanges)); // 输出: true

额外说明

  • 若需要将「区间首尾相接」(如前一个结束于9月23日,后一个起始于9月23日)判定为重叠,只需把判断条件改为currentStart <= prevEnd即可
  • 排序时使用getTime()转时间戳比较,比直接对比Date对象更可靠,避免不同环境下的潜在兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:40:31