Java 当地时间23.59和00:01之间

Java 当地时间23.59和00:01之间,java,time,java-8,java-time,localtime,Java,Time,Java 8,Java Time,Localtime,我想检查LocalTime是否为午夜。对于这个用例,午夜被定义为介于23:59和00:01之间的任何时间。这是一个2分钟的范围 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
是否为午夜。对于这个用例,午夜被定义为介于
23:59
00:01
之间的任何时间。这是一个2分钟的范围

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) {
    return time.isAfter(ONE_MINUTE_BEFORE_MIDNIGHT)
        && time.isBefore(ONE_MINUTE_AFTER_MIDNIGHT);
}
此方法总是返回
false
。即使对于
LocalTime.午夜
。但是,它应该返回
true


我如何检查时间是否为从午夜算起的
+-1
分钟?

如果确实需要这样做,它无法同时满足这两个条件。考虑使用,或者,该代码返回true为我:< /P>
public static void main(String[] args)
{
    LocalTime ONE_MINUTE_BEFORE_MIDNIGHT = LocalTime.of(23, 59, 0);
    LocalTime ONE_MINUTE_AFTER_MIDNIGHT = LocalTime.of(0, 1, 0);
    LocalTime md = LocalTime.MIDNIGHT;
    System.out.println(md.isBefore(ONE_MINUTE_AFTER_MIDNIGHT) || md.isAfter(ONE_MINUTE_BEFORE_MIDNIGHT));
}

与其检查
时间
是否在
23:59
之后和
00:01
之前,不如检查它是否在
23:59
之后或
00:01
之前

public boolean isAtMidnight(LocalTime time){
    return time.isAfter(ONE_MINUTE_BEFORE_MIDNIGHT) || time.isBefore(ONE_MINUTE_AFTER_MIDNIGHT);
}
如果我们查看
LocalTime#isAfter
的实现,我们会看到以下内容:

public boolean isAfter(LocalTime other) {
    return compareTo(other) > 0;
}
查看
LocalTime#compare to

@Override
public int compareTo(LocalTime other) {
    int cmp = Integer.compare(hour, other.hour);
    if (cmp == 0) {
        cmp = Integer.compare(minute, other.minute);
        if (cmp == 0) {
            cmp = Integer.compare(second, other.second);
            if (cmp == 0) {
                cmp = Integer.compare(nano, other.nano);
            }
        }
    }
    return cmp;
}
我们可以看到,
LocalTime
的两个实例首先按各自的小时、分钟、秒和纳秒进行比较。对于
LocalTime#compareTo
返回大于
0
的值以满足
LocalTime#isAfter
,第一个
LocalTime
实例的小时必须大于第二个实例的小时。对于
00:00
23:59
,这是正确的,因此方法返回
false
。对
LocalTime#isBefore
也可以进行相同的分析,您将得到相同的结果


请记住,如果您想精确,您可以只查看
LocalTime.MIDNIGHT
,但我假设您认为1分钟范围内的任何时间都是“午夜”(包括秒)。

解决方案是使用
|
而不是
&

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

这太违反直觉了,不是吗?诀窍是
00:00:01
不在
23:59
之后,所以这总是会失败。这是因为
LocalTime.isAfter
LocalTime.isBefore
假设这些时间是同一天的时间

正如前面所解释的,您必须使用
|
而不是
&
。我认为,如果以这种方式重新组织条件中的变量,则更具可读性:

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) {
    return ONE_MINUTE_BEFORE_MIDNIGHT.isBefore(time) || ONE_MINUTE_AFTER_MIDNIGHT.isAfter(time);
}

午夜前一分钟早于…

提示:您确定要在23:59之后和00:01之前吗?建议:限制变量更明确地定义为
private final LocalTime午夜前一分钟=LocalTime.midnight.minutes minutes(1)LocalTime
没有
天的概念。