LocalTime在23.59和00:01之间

时间:2018-03-23 13:54:01

标签: java time java-time localtime

我想检查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);
}

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

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

4 个答案:

答案 0 :(得分:17)

而不是在time之前检查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#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的值以满足0,第一个LocalTime#isAfter实例的小时数必须大于第二个实例的小时数。对于LocalTime00:00为真,因此您的方法返回23:59的原因。可以对false进行相同的分析,您将得到相同的结果。

请注意,如果您想要准确无误,可以查看LocalTime#isBefore,但我认为您考虑在1分钟范围内的任何时间为"午夜&#34 ; (包括秒)。

答案 1 :(得分:16)

解决方案是使用||代替&&

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

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

答案 2 :(得分:3)

如果你真的需要这样做,它就不能满足这两种说法。考虑使用或,此代码对我来说返回true:

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

答案 3 :(得分:3)

如前所述,您必须使用||代替&&。如果你以这种方式重新组织变量,我认为更具可读性:

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

午夜之前的一分钟之前......