检查 LocalDateTime 是否在时间范围内

Rk *_*iri 3 datetime localtime java-8 datetime-comparison java-time

我有一个时间 A 应该在时间 B 的 90 分钟范围内(之前和之后)。

示例:如果 timeB 是 4:00 pm ,则时间 A 应该在 2:30pm (-90) 到 5:30pm (+90) 之间

尝试了以下方法:

if(timeA.isAfter(timeB.minusMinutes(90)) || timeA.isBefore(timeB.plusMinutes(90))) {
    return isInRange;   
}
Run Code Online (Sandbox Code Playgroud)

你能帮我这里的逻辑有什么问题吗?

小智 5

正如@JB Nizet 在评论中所说,您正在使用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;   
}
Run Code Online (Sandbox Code Playgroud)

但上面的代码不会返回true,如果A正好前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;
}
Run Code Online (Sandbox Code Playgroud)

另一种替代方法是使用 ajava.time.temporal.ChronoUnit来获取AB以分钟为单位的差异,并检查其值:

// get the difference in minutes
long diff = Math.abs(ChronoUnit.MINUTES.between(timeA, timeB));
if (diff <= 90) {
    return isInRange;
}
Run Code Online (Sandbox Code Playgroud)

我使用Math.abs是因为如果A在之后差异可能是负数B(因此将其调整为正数)。然后我检查差异是否小于(或等于)到 90 分钟。if (diff < 90)如果要排除“等于 90 分钟”的情况,可以将其更改为。


方法之间存在差异。

ChronoUnit四舍五入的差异。例如,如果A在90分59秒后B,将分差四舍五入为90分钟,if (diff <= 90)将是true,在使用isBeforeequals返回false