我想检查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.MIDNIGHT
。但是,它应该返回true
。
如何从午夜检查时间是否为+-1
分钟?
答案 0 :(得分:17)
而不是在time
之前检查23:59
之后是否00:01
和,而应检查它是否在23:59
之后1>}之前。
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
实例的小时数必须大于第二个实例的小时数。对于LocalTime
和00: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.isAfter
或LocalTime.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);
}
午夜之前的一分钟在之前......