DEBUG.WIKI
雨云;给项目一台云服务器
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →
PanstarCloud:部署应用,接入 AI,云服务器与 AI 网关

Luxon 空区间放在范围中间,overlaps 却返回 true

Luxon 3.7.2 的 overlaps 只比较端点,可能把内部零长度区间当成重叠。明确空区间业务语义,先检查有效性与正长度。

一个有效区间从5点到8点,另一个区间起止都是6点。后者不包含任何时刻,Luxon 的 overlaps 却返回 true;换成5点或8点的零长度区间,结果又变成 false。

在正式Luxon3.7.2中,overlaps只检查 this.e > other.s && this.s < other.e。位于内部的零长度端点能同时满足这两个比较,方法没有先排除空区间。

先决定零长度在业务里代表什么

半开时间范围通常包含起点、不包含终点。起止相同的区间为空,不应与预约范围形成占用冲突。但有些应用把零长度记录当成提醒时点,这时“时点落在范围内”是另一项判断,不应借用范围重叠偷偷表达它。

下面只实现“两个有效、正长度范围是否重叠”。无效输入保留错误路径,不将它混成没有冲突:

function positiveRangeOverlap(a, b) {
  if (!a.isValid || !b.isValid) {
    throw new RangeError('Invalid interval');
  }
  return a.length('milliseconds') > 0
    && b.length('milliseconds') > 0
    && a.overlaps(b);
}

a和b应已经由调用方创建为Luxon Interval,null或其他对象还需在接口边界处理。先判断isValid也避免对无效对象调用其他未作同等防护的方法。

若业务需要提醒点位于区间内,应显式使用一个DateTime点和相应的contains规则,并确认终点是否排除。不要给空区间自动增加一毫秒,那会凭空制造占用,影响计费、日程或冲突判断。

不同区间方法不能互相代替

在同一组输入上,intersection可能没有交集,overlaps却仍返回true。这是本题要识别的不一致,不能通过改成只看返回对象是否存在就掩盖原来的契约。

Interval.merge还涉及相邻区间的合并规则。不要全局替换库的overlaps方法,假定所有依赖它的算法都只需要这一处变化。局部判断最好放在明确的业务冲突入口,保留原始区间与其他用途。

回归时将同一个空区间分别放在起点、内部和终点,两个参数顺序都检查;再覆盖真正重叠、首尾相接、完全分离和无效区间。对于半开范围,首尾相接与正长度重叠也应按约定区分。

目前核对的正式3.7.2仍只有上述端点比较,没有已核证的正式修复版本。后续升级应对同一组样例重新核对,而不是只在一条有长度的正常区间上验证。