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)当然,如果你想检查中午+/-1分钟,你需要测试“11:59之后到12:01之前”…出于好奇,为什么23.59.01被认为是午夜?谢谢你的解释这是一个比最高投票率的答案好得多的答案。@Lister先生,我很不同意,主要是因为LocalTime
没有天的概念。