LocalTime 在 23.59 和 00:01 之间

LocalTime between 23.59 and 00:01

我想检查 LocalTime 是否是午夜。对于此用例,午夜定义为 23:5900: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);
}

此方法始终 returning false。即使 LocalTime.MIDNIGHT。但是,它应该 return true.

我如何检查时间是否距午夜 +-1 分钟?

如果你真的需要那样做,它不能满足这两个陈述。考虑使用或者,此代码 returns 对我来说是正确的:

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));
}

而不是检查 time 是否在 23:59 之后 00:01 之前,你应该检查它是否在 [=14= 之后] 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#compareTo:

@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到return大于0的值满足LocalTime#isAfter,第一个LocalTime实例的小时必须大于第二个实例的小时。对于 00:0023:59,这 不是 ,因此您的方法 return 是 false。可以对 LocalTime#isBefore 进行相同的分析,您将得到相同的结果。

请记住,如果您想要准确的话,您可以只检查 LocalTime.MIDNIGHT,但我假设您正在考虑将 1 分钟范围内的任何时间设为 "midnight"(包括秒)。

解决办法是用||代替&&:

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

就是这样counter-intuitive,不是吗?诀窍是 00:00:01 不在 23:59 之后,所以它总是会失败。之所以如此,是因为 LocalTime.isAfterLocalTime.isBefore 假定这些时间是 同一天

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

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

午夜一分钟...

之前