如何检查两个日期之间是否会发生具体时间,例如: 时间 - > 11:34 日期1.12 17:00< - > 2.12 17:01
答案 0 :(得分:1)
这个想法是计算开始日期和结束日期之间的日期。然后将其与您的特定时间配对,并检查是否有任何日期时间符合以下约束:start <= date + time <= end
。
public boolean isTimeInBetween(LocalDateTime start, LocalDateTime end, LocalTime time) {
return start.toLocalDate().datesUntil(end.plusDays(1).toLocalDate())
.anyMatch(d -> !(d.atTime(time).isBefore(start) || d.atTime(time).isAfter(end)));
}
答案 1 :(得分:1)
LocalDateTime startDateTime = LocalDateTime.of(2017, Month.DECEMBER, 1, 17, 0);
LocalDateTime endDateTime = LocalDateTime.of(2017, Month.DECEMBER, 2, 17, 1);
LocalTime timeToTest = LocalTime.of(11, 34);
// Does the timeToTest occur some time between startDateTime and endDateTime?
LocalDateTime candidateDateTime = startDateTime.with(timeToTest);
if (candidateDateTime.isBefore(startDateTime)) {
// too early; try next day
candidateDateTime = candidateDateTime.plusDays(1);
}
if (candidateDateTime.isAfter(endDateTime)) {
System.out.println("No, " + timeToTest + " does not occur between " + startDateTime + " and " + endDateTime);
} else {
System.out.println("Yes, the time occurs at " + candidateDateTime);
}
打印
Yes, the time occurs at 2017-12-02T11:34
这有点棘手。我正在利用LocalTime
实现TemporalAdjuster
接口的事实,这允许我将一个调整为另一个日期时间类,在本例中为startDateTime
。我一开始不知道这是否会调整前进或后退的时间,因此我需要在随后的if
语句中对其进行测试。
请考虑您是否希望您的日期时间间隔为包含/关闭,独占/开放或半开放。标准建议是最后一个:包括开始时间,排除结束时间;但只有你知道自己的要求。
另请注意,使用LocalDateTime
可以防止将夏令时(DST)和其他过渡考虑在内。例如,如果在春天向前移动时钟,那天某些时候不会存在,但上面的代码很乐意告诉你它们确实存在。
答案 2 :(得分:0)
您可以定义3个变量,开始,结束和测试时间。使用Java 8的LocaleDateTime使这很简单。请参阅下面的示例,其中包含3个测试用例:
public static void main(String[] args) {
LocalDateTime start = LocalDateTime.of(2017, 12, 1, 17, 0);
LocalDateTime end = LocalDateTime.of(2017, 12, 2, 17, 1);
System.out.println("Test with time before range");
System.out.println(isInRange(start, end, LocalDateTime.of(2017, 12, 1, 12, 0)));
System.out.println("Test with time in range");
System.out.println(isInRange(start, end, LocalDateTime.of(2017, 12, 2, 11, 34)));
System.out.println("Test with time after range");
System.out.println(isInRange(start, end, LocalDateTime.of(2017, 12, 2, 20, 0)));
}
private static boolean isInRange(LocalDateTime start, LocalDateTime end, LocalDateTime test) {
return !(test.isBefore(start) || test.isAfter(end));
}
输出:
在范围之前测试时间
假
按时间范围进行测试
真
在范围之后用时间进行测试
假