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

如何用单行表达式判断指定LocalTime是否处于含跨午夜情况的时间区间内?

如何用单行表达式判断指定LocalTime是否处于含跨午夜情况的时间区间内?

嘿,这个问题我太有共鸣了!之前用常规的!targetTime.isBefore(startTime) && !targetTime.isAfter(endTime)判断时间区间,结果碰到跨午夜的场景(比如21:00到次日05:00)直接失效——毕竟LocalTime只存时间没日期,跨午夜时start的数值反而比end大,常规逻辑完全不适用。

要搞定两种场景(不跨午夜/跨午夜)的单行表达式其实很简单,核心是先判断区间是否跨午夜,再对应不同的判断逻辑:

boolean isInRange = startTime.isBefore(endTime) 
    ? !targetTime.isBefore(startTime) && !targetTime.isAfter(endTime) 
    : targetTime.isAfter(startTime) || targetTime.isBefore(endTime);

要是你追求极致简洁,还能把它压缩成一行:

boolean isInRange = startTime.isBefore(endTime) ? !targetTime.isBefore(startTime) && !targetTime.isAfter(endTime) : targetTime.isAfter(startTime) || targetTime.isBefore(endTime);

我给你拆解下逻辑:

  • 当区间不跨午夜(比如09:00到17:00):startTime < endTime,这时候用原来的逻辑——target既不早于start也不晚于end,就算在区间内。
  • 当区间跨午夜(比如21:00到05:00):startTime > endTime,这时候只要target在start之后(比如21:0024:00)或者在end之前(00:0005:00),就算在区间里。

验证几个典型场景:

  • 场景1:start=21:00,end=05:00,target=23:30 → 符合targetTime.isAfter(startTime),返回true
  • 场景2:start=21:00,end=05:00,target=02:30 → 符合targetTime.isBefore(endTime),返回true
  • 场景3:start=21:00,end=05:00,target=10:00 → 两个条件都不满足,返回false,完全正确!

如果你的项目用的是Java 12及以上,还能借助LocalTime.isBetween()简化不跨午夜的判断,代码更清爽:

boolean isInRange = startTime.isBefore(endTime) 
    ? targetTime.isBetween(startTime, endTime) 
    : targetTime.isAfter(startTime) || targetTime.isBefore(endTime);

备注:内容来源于stack exchange,提问作者workerjoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 09:19:53