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

LocalTime午夜判断问题:如何检测时间是否在午夜前后1分钟内?

解决LocalTime午夜时段检测的问题

你的方法始终返回false的核心原因是LocalTime的时间线是线性的,从00:00到23:59:59.999...,不存在同时满足「在23:59之后」和「在00:01之前」的时间——这两个区间完全独立,用&&连接自然永远得不到true。

正确的逻辑思路

你定义的午夜时段是「23:59至00:01之间的2分钟」,这个范围其实是两个连续的区间:

  1. 23:59:00 到 23:59:59.999...(午夜前1分钟)
  2. 00:00:00.000 到 00:01:00(午夜后1分钟)

所以判断逻辑应该是时间属于第一个区间,或者属于第二个区间,用逻辑或||替代逻辑与&&,同时要包含边界值(比如23:59、00:00、00:01这些关键时间点)。

优化后的代码实现

这里提供两种简洁可靠的写法:

写法1:使用compareTo(推荐)

private final LocalTime ONE_MINUTE_BEFORE_MIDNIGHT = LocalTime.of(23, 59, 0);
private final LocalTime ONE_MINUTE_AFTER_MIDNIGHT = LocalTime.of(0, 1, 0);

public boolean isAtMidnight(LocalTime time) {
    // 时间 >= 23:59 或者 时间 <= 00:01
    return time.compareTo(ONE_MINUTE_BEFORE_MIDNIGHT) >= 0 
            || time.compareTo(ONE_MINUTE_AFTER_MIDNIGHT) <= 0;
}

写法2:使用isAfter/isBefore+equals

如果你更倾向于直观的方法调用,也可以这样写:

public boolean isAtMidnight(LocalTime time) {
    return time.equals(ONE_MINUTE_BEFORE_MIDNIGHT) 
            || time.isAfter(ONE_MINUTE_BEFORE_MIDNIGHT)
            || time.equals(ONE_MINUTE_AFTER_MIDNIGHT)
            || time.isBefore(ONE_MINUTE_AFTER_MIDNIGHT);
}

验证边界情况

这两种写法都能正确处理以下场景:

  • 传入LocalTime.MIDNIGHT(00:00)→ 返回true
  • 传入23:59:00 → 返回true
  • 传入00:01:00 → 返回true
  • 传入23:59:30或00:00:45 → 返回true
  • 传入23:58:59或00:01:01 → 返回false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:21