Android判断LocalTime是否处于包含跨午夜的指定时间区间内
问题修复方案
核心原因是LocalTime属于纯时间类型,不携带日期信息,当目标区间跨午夜时,startShift减1小时后的时间会大于endShift,原逻辑里「同时满足大于左边界且小于右边界」的与条件天然无法成立,直接导致判断失效。
调整后的判断逻辑
分两种场景处理即可覆盖所有情况:
- 左边界(startShift提前1小时)小于右边界(endShift):属于非跨天场景,沿用原有判断逻辑
- 左边界大于等于右边界:属于跨天场景,只要当前时间大于左边界 或 小于右边界,就属于目标区间
实现代码
// 计算区间左边界:排班开始时间提前1小时 LocalTime leftBound = startShift.minus(1, ChronoUnit.HOURS); boolean isInShift; if (leftBound.isBefore(endShift)) { // 非跨天场景 isInShift = localTimeNow.isAfter(leftBound) && localTimeNow.isBefore(endShift); } else { // 跨天场景 isInShift = localTimeNow.isAfter(leftBound) || localTimeNow.isBefore(endShift); } if (isInShift) { Toast.makeText(this, "In shift", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Not in shift", Toast.LENGTH_SHORT).show(); }
边界调整说明
如果需要包含边界的相等情况(比如刚好到提前1小时的时间就算进入区间),可以把isAfter替换为!isBefore,isBefore替换为!isAfter即可,示例左闭右开逻辑如下:
// 左闭右开的跨天判断 isInShift = !localTimeNow.isBefore(leftBound) || localTimeNow.isBefore(endShift);
内容的提问来源于stack exchange,提问作者Kevin Murvie
相关产品推荐
相关产品推荐

