As @JB Nizet 在评论中说 https://stackoverflow.com/questions/46942351/checking-if-localdatetime-falls-within-a-time-range/46943265#comment80832159_46942351,您正在使用OR操作员 (||
).
所以你正在测试是否A is after B - 90
OR A is before B + 90
。如果仅满足其中一个条件,则返回true
.
检查是否A
在范围内,两个条件都必须满足,所以你必须使用AND操作员 (&&
):
if (timeA.isAfter(timeB.minusMinutes(90)) && timeA.isBefore(timeB.plusMinutes(90))) {
return isInRange;
}
但上面的代码没有返回true
if A
is exactly之前或之后 90 分钟B
。如果你想让它返回true
当差异也正好是 90 分钟时,您必须更改条件来检查:
// lower and upper limits
LocalDateTime lower = timeB.minusMinutes(90);
LocalDateTime upper = timeB.plusMinutes(90);
// also test if A is exactly 90 minutes before or after B
if ((timeA.isAfter(lower) || timeA.equals(lower)) && (timeA.isBefore(upper) || timeA.equals(upper))) {
return isInRange;
}
另一种选择是使用java.time.temporal.ChronoUnit
得到之间的差异A
and B
以分钟为单位,并检查其值:
// get the difference in minutes
long diff = Math.abs(ChronoUnit.MINUTES.between(timeA, timeB));
if (diff <= 90) {
return isInRange;
}
I used Math.abs
因为差异可能是负数,如果A
是在之后B
(所以调整为正数)。然后我检查差异是否小于(或等于)90 分钟。你可以将其更改为if (diff < 90)
如果你想排除“等于90分钟” case.
这些方法之间存在差异。
ChronoUnit
舍入差异。例如如果A
90 分 59 秒后B
,差异将四舍五入为 90 分钟,并且if (diff <= 90)
将true
,同时使用isBefore
and equals
将返回false
.