【问题标题】:How to calculate time difference between two dates using LocalDateTime in Java 8?如何在 Java 8 中使用 LocalDateTime 计算两个日期之间的时间差?
【发布时间】:2017-07-07 10:15:35
【问题描述】:

给出了许多答案,但我无法找到与我的情况相符的答案。我还需要找到 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.

【问题讨论】:

  • 你也可以使用ChronoUnit.HOURS.between(date1, date2)
  • 你知道LocalDateTime 故意没有时区的概念吗?因此,使用该类意味着您将忽略任何异常情况,例如夏令时 (DST)。如果你想考虑这样的现实,请使用ZonedDateTime

标签: date datetime java-8 datediff


【解决方案1】:

以下打印出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 因此,只需以秒或毫秒为单位获取持续时间,或任何您需要的时间,并检查它是否超过 8 小时的秒数(或毫秒等)。
  • @Harpreet 用一些额外的代码更新了我的答案
【解决方案2】:

我的理解是,您希望获得这两个日期之间的差异,并根据该差异的小时数、分钟数和秒数来“打破”它。

您可以使用已经解释过的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");

在 Java 9 及更高版本中,您可以将新的 Duration::to…Part 方法调用到 get number of days, hours, minutes, or seconds,而不是自己计算数字。

输出将是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2021-09-11
    • 2021-11-25
    • 2011-08-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多