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

11

有很多答案,但我找不到符合我的情况的答案。 我需要找出时间上的8小时差异,同时还要在日期更改时找出差异。例如,如果时间大于8小时,则不执行某些操作。

我们是否有任何方法可以在Java-8中使用LocalDateTime实现相同效果?

我尝试使用以下内容,但无法实现相同效果。

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.");

分别检查时间和日期是很困难的。

最初我像这样编码,但它看起来不正确:

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

请问有人能建议如何进行减法运算,例如:

2017 07 06 23:30:00 - 2017 07 07 01:30:00 - Should return 2 hours.

2
你也可以使用 ChronoUnit.HOURS.between(date1, date2) - user7605325
3
你知道 LocalDateTime 故意没有时区的概念吗?因此,使用该类意味着您将忽略任何异常情况,例如夏令时(DST)。如果您想考虑这些现实情况,请使用 ZonedDateTime - Basil Bourque
可能是重复的问题:Java 8:计算两个LocalDateTime之间的差异 - rogerdpack
2个回答

19

以下代码输出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());

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


当时间差小于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");
}

我们如何检查小时、分钟和秒数?因为条件检查是如果时间超过8小时,则执行某些操作,所以=和>适用于toHours,但不适用于分钟和秒数。 - Harpreet
2
@Harpreet 所以只需获取以秒、毫秒或其他所需单位表示的持续时间,并检查它是否超过了8小时的秒数(或毫秒数等)。 - David Conrad
@Harpreet 我更新了我的答案,并添加了一些额外的代码。 - Robin Topper

10
My understanding is that you want to calculate the difference between two dates and express it in terms of hours, minutes, and seconds. You can use the Duration class as explained before, but it calculates the difference in seconds and nanoseconds, so you need to convert the amount of seconds into separate fields through some mathematical calculations.
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");

在Java 9及更高版本中,您可以调用新的Duration::to…Part方法获取天数、小时数、分钟数或秒数,而不是自己计算这些数字。
输出将为:

7小时30分钟55秒

变量hoursminutesseconds将分别具有73055的值。如果您还想要纳秒,只需调用duration.getNano()即可获得相应的值(在上面的示例中,它是0)。
如果我使用不同的值进行测试:
LocalDateTime d1 = LocalDateTime.of(2017, 7, 6, 23, 30, 0);
LocalDateTime d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0);

结果将是:

2小时0分钟0秒


如果您只想得到小时差异,您可以使用以下方法:
ChronoUnit.HOURS.between(d1, d2);

你可以选择使用 Math.abs 来避免负值。
这将返回小时差异,忽略剩余的分钟和秒数:在第一个示例中 (d2 = LocalDateTime.of(2017, 7, 7, 7, 0, 55)) 它将返回 7,而在第二个示例中 (d2 = LocalDateTime.of(2017, 7, 7, 1, 30, 0)) 它将返回 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接