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

如何在Java8中使用LocalDateTime计算两个日期之间的时差?,date,datetime,java-8,datediff,Date,Datetime,Java 8,Datediff,给出的答案很多,但我无法找到与我的情况相符的答案。我需要找出8小时的时间差异以及日期变化。例如,如果时间大于8小时,则不要执行某些操作 在Java-8的LocalDateTime中,我们有没有实现相同功能的方法 我曾尝试使用以下方法,但无法达到同样的效果 LocalDateTime fromDateTime = LocalDateTime.of(2017, 07, 07, 07, 00, 55); LocalDateTime toDateTime = LocalDateTime.now(); L

给出的答案很多,但我无法找到与我的情况相符的答案。我需要找出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
,与您预期的一样

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

我的理解是,你想得到这两个日期之间的差异,并“打破”它,在多少小时,分钟和秒这个差异是

如前所述,您可以使用
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");
在Java9和更高版本中,您可以调用新的
Duration::to…Part
方法来计算数字,而不是自己计算数字

输出将是:

7小时30分55秒

变量
hours
minutes
seconds
的值分别为
7
30
55
。如果还需要纳秒,只需调用
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

我们如何在小时分钟和秒数上检查它?因为条件检查是,如果时间超过8小时,则执行某项操作,因此=和>的工作时间为小时,而不是分和秒。@Harpreet因此,只需获取以秒或毫秒为单位的持续时间,或您需要的任何时间,并检查持续时间是否超过8小时的秒(或毫秒等)@Harpreet用一些额外的代码更新了我的答案。你也可以使用
ChronoUnit.HOURS.between(date1,date2)
你知道
LocalDateTime
故意没有时区的概念吗?因此,使用该类意味着您将忽略任何异常,例如夏令时(DST)。如果您想解释这些现实,请使用
ZoneDateTime
。可能的重复项