LocalTime 在 23.59 和 00:01 之间
LocalTime between 23.59 and 00:01
我想检查 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);
}
此方法始终 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:00
和 23: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.isAfter
或 LocalTime.isBefore
假定这些时间是 同一天 。
如前所述,您必须使用 ||
而不是 &&
。如果您以这种方式重新组织条件中的变量,我认为更具可读性:
public boolean isAtMidnight(LocalTime time) {
return ONE_MINUTE_BEFORE_MIDNIGHT.isBefore(time) || ONE_MINUTE_AFTER_MIDNIGHT.isAfter(time);
}
午夜前一分钟在...
之前
我想检查 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);
}
此方法始终 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:00
和 23: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.isAfter
或 LocalTime.isBefore
假定这些时间是 同一天 。
如前所述,您必须使用 ||
而不是 &&
。如果您以这种方式重新组织条件中的变量,我认为更具可读性:
public boolean isAtMidnight(LocalTime time) {
return ONE_MINUTE_BEFORE_MIDNIGHT.isBefore(time) || ONE_MINUTE_AFTER_MIDNIGHT.isAfter(time);
}
午夜前一分钟在...
之前