检查LocalDateTime是否在某个时间范围内

时间:2017-10-25 21:29:25

标签: datetime java-8 java-time localtime datetime-comparison

我的时间A应该在90分钟的时间范围内(前后)。

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

尝试以下方法:

if(timeA.isAfter(timeB.minusMinutes(90)) || timeA.isBefore(timeB.plusMinutes(90))) {
    return isInRange;   
}

你能帮助我解决这里的逻辑错误吗?

2 个答案:

答案 0 :(得分:2)

作为@JB Nizet said in the comments,您使用的是 OR 运算符(||)。
因此,您正在测试A is after B - 90 A is before B + 90。如果只满足其中一个条件,则返回true

要检查A是否在范围内,必须满足这两个条件,因此您必须使用 AND 运算符(&&):

if (timeA.isAfter(timeB.minusMinutes(90)) && timeA.isBefore(timeB.plusMinutes(90))) {
    return isInRange;   
}

但如果在true之前或之后90分钟A 完全,则上述代码不会返回B。如果您希望它在差异也正好是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在几分钟内获得AB之间的差异,并检查其值:

// 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解决了差异。例如如果AB后90分59秒,则差异将四舍五入为90分钟,if (diff <= 90)true,同时使用isBefore和{ {1}}将返回equals

答案 1 :(得分:0)

LocalDateTime 实现了 Comparable 接口。为什么不使用它来检查一个值是否在这样的范围内:

public static boolean within(
    @NotNull LocalDateTime toCheck, 
    @NotNull LocalDateTime startInterval, 
    @NotNull LocalDateTime endInterval) 
{
    return toCheck.compareTo(startInterval) >= 0 && toCheck.compareTo(endInterval) <= 0;
}