如何使用Java 8中的LocalDateTime计算两个日期之间的时差?

Har*_*eet 8 datetime datediff date java-8

有很多答案,但我无法找到与我的情况兼容.我需要找到8小时的差异以及日期变化.就像时间大于8小时然后不执行某些事情.

我们有没有LocalDateTime在Java-8中实现相同的方法?

我试过使用以下但无法实现相同的目标.

LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55);
LocalDateTime toDateTime = LocalDateTime.now();
LocalDateTime tempDateTime = LocalDateTime.from(fromDateTime);

long years = tempDateTime.until(toDateTime, ChronoUnit.YEARS);
tempDateTime = tempDateTime.plusYears(years);

long months = tempDateTime.until(toDateTime, ChronoUnit.MONTHS);
tempDateTime = tempDateTime.plusMonths(months);

long days = tempDateTime.until(toDateTime, ChronoUnit.DAYS);
tempDateTime = tempDateTime.plusDays(days);

long hours = tempDateTime.until(toDateTime, ChronoUnit.HOURS);
tempDateTime = tempDateTime.plusHours(hours);

long minutes = tempDateTime.until(toDateTime, ChronoUnit.MINUTES);
tempDateTime = tempDateTime.plusMinutes(minutes);

long seconds = tempDateTime.until(toDateTime, ChronoUnit.SECONDS);

System.out.println("" + java.time.Duration.between(tempDateTime, toDateTime).toHours());

System.out.println(years + " years "
        + months + " months "
        + days + " days "
        + hours + " hours "
        + minutes + " minutes "
        + seconds + " seconds.");
Run Code Online (Sandbox Code Playgroud)

很难分别检查时间和日期.

最初我编写它,但它看起来不正确:

return openBrat!=null 
        && openBrat.until(LocalDateTime.now(), ChronoUnit.DAYS) == 0 &&  
          openBrat.until(LocalDateTime.now(), ChronoUnit.HOURS) >= 8
         && openBrat.until(LocalDateTime.now(), ChronoUnit.Minutes) >= 0;
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何减去如下:

2017 07 06 23:30:00 - 2017 07 07 01:30:00 - Should return 2 hours.
Run Code Online (Sandbox Code Playgroud)

Rob*_*per 16

以下打印2,就像您期望的那样.

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
System.out.println(Duration.between(ldt1, ldt2).toHours());
Run Code Online (Sandbox Code Playgroud)

您的代码没有任何问题.如果您没有得到预期的结果,您可能需要检查您的期望是否正确.


要在差异小于8小时时执行某些操作,您可以执行以下操作:

LocalDateTime ldt1 = LocalDateTime.of(2017, 07, 06, 23, 30, 00);
LocalDateTime ldt2 = LocalDateTime.of(2017, 07, 07, 1, 30, 00);
Duration d1 = Duration.between(ldt1, ldt2);
Duration d2 = Duration.ofHours(8);

if (d1.compareTo(d2) > 0) {
    System.out.println("do nothing");
} else {
    System.out.println("do something");
}
Run Code Online (Sandbox Code Playgroud)

  • @Harpreet 所以只需获取以秒、毫秒或任何您需要的时间为单位的持续时间,并检查它是否超过 8 小时的秒数(或毫秒等)。 (2认同)

小智 8

我的理解是你希望得到这两个日期之间的差异,并根据这个差异的小时数,分钟数和秒数来"打破"它.

您可以使用Duration已经解释过的类.但是Duration计算以秒和纳秒为单位的差异,所以你必须做一些数学计算才能在单独的字段中得到这么多秒:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55);

Duration duration = Duration.between(d1, d2);
// total seconds of difference (using Math.abs to avoid negative values)
long seconds = Math.abs(duration.getSeconds());
long hours = seconds / 3600;
seconds -= (hours * 3600);
long minutes = seconds / 60;
seconds -= (minutes * 60);
System.out.println(hours + " hours " + minutes + " minutes " + seconds + " seconds");
Run Code Online (Sandbox Code Playgroud)

在Java 9及更高版本中,您可以调用新Duration::to…Part方法来获取天数,小时数,分钟数或秒数,而不是自己计算数字.

输出将是:

7小时30分55秒

和变量hours,minutes并且seconds将有各自的价值观7,3055.如果你也想要纳秒,只需调用duration.getNano()以获得相应的值(在上面的例子中,它是0).

如果我测试不同的值:

LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0);
Run Code Online (Sandbox Code Playgroud)

结果将是:

2小时0分0秒


如果您只想要小时差异,可以使用:

ChronoUnit.HOURS.between(d1, d2);
Run Code Online (Sandbox Code Playgroud)

您可以选择使用Math.abs以避免负值.

这将返回以小时为单位的差异,忽略剩余的分钟和秒:在第一个示例(d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55))中它将返回7,在第二个示例(d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0))中它将返回2.