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

JavaScript如何过滤与指定时间区间无重叠的ISO日期对象

时间区间过滤最简实现

不需要枚举所有5种交互场景写大量if-else分支,判断两个时间区间是否重叠有非常简洁的反向逻辑:
两个区间不发生重叠的情况只有两种,其余所有场景都属于重叠/落在区间内,直接排除即可:

  • 列表项的结束时间早于或等于assignment的开始时间(整段完全在目标区间之前)
  • 列表项的开始时间晚于或等于assignment的结束时间(整段完全在目标区间之后)

结合你正在使用的Luxon库,先把ISO格式的时间字符串转为DateTime实例做数值比较(避免原生字符串时间比较的潜在兼容问题),实现代码非常精简:

import { DateTime } from 'luxon';

// 提前转换assignment的时间,避免循环内重复计算
const assignStart = DateTime.fromISO(assignment.startTime);
const assignEnd = DateTime.fromISO(assignment.endTime);

const result = list.filter(item => {
  const itemStart = DateTime.fromISO(item.startTime);
  const itemEnd = DateTime.fromISO(item.endTime);
  // 仅保留完全不重叠的条目
  return itemEnd <= assignStart || itemStart >= assignEnd;
});

逻辑说明

你梳理的5种场景里:

  • Scenario1、Scenario5对应上述判断覆盖的不重叠场景,会被保留在结果中
  • Scenario2、Scenario3、Scenario4都属于重叠场景,不满足不重叠判断条件,会被自动过滤

如果你的业务规则对边界判定有不同要求,比如「前一段的结束时间和后一段的开始时间相等也算冲突」,只需要把判断条件里的<=改为<、>=改为>即可适配。
用你给出的示例数据运行这段代码,得到的结果和你预期的result完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:24:15