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

Kotlin判断两个日期范围是否重叠 求更惯用高效的实现

Kotlin 区间重叠判断优化方案

你当前的实现是判断两个闭区间是否存在重叠,逻辑正确性没有问题,但可以从性能、语义简洁度、Kotlin生态适配三个方向做优化。

最优性能写法

区间不重叠的场景仅存在两种:

  • A区间整体在B区间之前(A.endAt < B.startAt)
  • A区间整体在B区间之后(A.startAt > B.endAt)
    对上述两种情况取反即可得到重叠判断逻辑,仅需最多2次比较运算,无额外对象创建,性能远高于原有3组或条件的写法,且覆盖所有重叠场景(部分相交、A包含B、B包含A):
val isOverlapped = A.endAt >= B.startAt && A.startAt <= B.endAt

你可以自行代入所有边界场景验证:

  • A包含B:A.startAt <= B.startAt 且 A.endAt >= B.endAt,两个判断条件均成立
  • A与B左相交:A.startAt < B.startAt 且 A.endAt 落在B区间内,两个判断条件均成立
  • A与B右相交:A.endAt > B.endAt 且 A.startAt 落在B区间内,两个判断条件均成立
  • A完全落在B区间内:两个判断条件均成立
  • 两区间无交集:两个判断条件至少有一个不成立,直接返回false

Kotlin 惯用写法

如果你的startAt、endAt是实现了Comparable接口的类型(时间类型如Long、Instant、LocalDateTime均满足该要求),可以借助Kotlin标准库的区间API提升代码可读性:

// 转为Kotlin原生闭区间
val rangeA = A.startAt..A.endAt
val rangeB = B.startAt..B.endAt

// Kotlin 1.5+ 可直接使用标准库的相交判断API,语义和自然语言完全一致
val isOverlapped = !rangeA.intersect(rangeB).isEmpty()

该API内部实现和上述最优性能写法逻辑完全一致,无额外性能损耗。

原有写法的额外开销说明

你原有代码中使用的in B.startAt..B.endAt语法,每次调用会临时生成一个ClosedRange实例,在高频调用场景(如批量判断万级以上区间数据)会产生不必要的对象创建压力,不建议在性能敏感路径使用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:33:17