作为@JB Nizet said in the comments,您使用的是 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;
}
但如果A正好在B 之前或之后90 分钟,则上面的代码不会返回true。如果您希望它在时差也正好是 90 分钟时返回 true,则必须更改条件以检查:
// 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 和B 之间的差异,并检查其值:
// get the difference in minutes
long diff = Math.abs(ChronoUnit.MINUTES.between(timeA, timeB));
if (diff <= 90) {
return isInRange;
}
我使用了Math.abs,因为如果A 在B 之后,差异可能是负数(因此它被调整为正数)。然后我检查差异是否小于(或等于)90 分钟。如果要排除 “等于 90 分钟” 的情况,可以将其更改为 if (diff < 90)。
这两种方法之间存在差异。
ChronoUnit 舍入差值。例如如果A 比B 晚90 分59 秒,则差值将四舍五入到90 分钟,if (diff <= 90) 将为true,而使用isBefore 和equals 将返回false。