如何用单行表达式判断指定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
相关产品推荐
相关产品推荐

