如何找到两个日期之间的时间

时间:2017-12-14 07:40:55

标签: java algorithm datetime java-8

如何检查两个日期之间是否会发生具体时间,例如: 时间 - > 11:34 日期1.12 17:00< - > 2.12 17:01

3 个答案:

答案 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));
}

输出:

  

在范围之前测试时间

     

     

按时间范围进行测试

     

     

在范围之后用时间进行测试