检查 LocalDateTime 是否在时间范围内
Checking if LocalDateTime falls within a time range
我有一个时间 A,它应该在时间 B 的 90 分钟范围内(之前和之后)。
示例:如果时间 B 是 4:00 pm ,时间 A 应该在 2:30pm (-90) 到 5:30pm (+90)
之间
尝试了以下方法:
if(timeA.isAfter(timeB.minusMinutes(90)) || timeA.isBefore(timeB.plusMinutes(90))) {
return isInRange;
}
你能帮我看看这里的逻辑有什么问题吗?
作为 ,您正在使用 OR 运算符 (||
)。
因此,您正在测试 A is after B - 90
或 A is before B + 90
。如果只满足其中一个条件,则returns true
.
要检查A
是否在范围内,必须满足两个条件,所以必须使用AND运算符(&&
):
if (timeA.isAfter(timeB.minusMinutes(90)) && timeA.isBefore(timeB.plusMinutes(90))) {
return isInRange;
}
但是如果 A
恰好 在 B
之前或之后 90 分钟,则上面的代码不会 return true
.如果你想让它returntrue
时差也正好是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
和 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 分钟。如果要排除 "equals to 90 minutes" 情况,可以将其更改为 if (diff < 90)
。
这两种方法之间存在差异。
ChronoUnit
四舍五入。例如如果 A
比 B
差 90 分 59 秒,则差值将四舍五入为 90 分钟,而 if (diff <= 90)
将是 true
,而使用 isBefore
和 equals
将 return false
.
LocalDateTime 实现了 Comparable 接口。为什么不使用它来检查值是否落在这样的范围内:
public static boolean within(
@NotNull LocalDateTime toCheck,
@NotNull LocalDateTime startInterval,
@NotNull LocalDateTime endInterval)
{
return toCheck.compareTo(startInterval) >= 0 && toCheck.compareTo(endInterval) <= 0;
}
我有一个时间 A,它应该在时间 B 的 90 分钟范围内(之前和之后)。
示例:如果时间 B 是 4:00 pm ,时间 A 应该在 2:30pm (-90) 到 5:30pm (+90)
之间尝试了以下方法:
if(timeA.isAfter(timeB.minusMinutes(90)) || timeA.isBefore(timeB.plusMinutes(90))) {
return isInRange;
}
你能帮我看看这里的逻辑有什么问题吗?
作为 ||
)。
因此,您正在测试 A is after B - 90
或 A is before B + 90
。如果只满足其中一个条件,则returns true
.
要检查A
是否在范围内,必须满足两个条件,所以必须使用AND运算符(&&
):
if (timeA.isAfter(timeB.minusMinutes(90)) && timeA.isBefore(timeB.plusMinutes(90))) {
return isInRange;
}
但是如果 A
恰好 在 B
之前或之后 90 分钟,则上面的代码不会 return true
.如果你想让它returntrue
时差也正好是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
和 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 分钟。如果要排除 "equals to 90 minutes" 情况,可以将其更改为 if (diff < 90)
。
这两种方法之间存在差异。
ChronoUnit
四舍五入。例如如果 A
比 B
差 90 分 59 秒,则差值将四舍五入为 90 分钟,而 if (diff <= 90)
将是 true
,而使用 isBefore
和 equals
将 return false
.
LocalDateTime 实现了 Comparable 接口。为什么不使用它来检查值是否落在这样的范围内:
public static boolean within(
@NotNull LocalDateTime toCheck,
@NotNull LocalDateTime startInterval,
@NotNull LocalDateTime endInterval)
{
return toCheck.compareTo(startInterval) >= 0 && toCheck.compareTo(endInterval) <= 0;
}