两个Java Date对象之间的小时+分钟

时间:2016-10-18 15:42:30

标签: java date

我已经找到了如何获得两个日期和分钟之间的小时数。我想要的是两者之间的确切差异,这是我使用的代码:

private String getHours(Message punch) {
    LocalTime out = Instant.ofEpochMilli(message.getOut().getTime()).atZone(ZoneId.of(message.getTimezone()))
            .toLocalTime();
    LocalTime in = Instant.ofEpochMilli(message.getIn().getTime()).atZone(ZoneId.of(message.getTimezone()))
            .toLocalTime();
    Duration duration = Duration.between(in, out);
    Long hours = duration.toHours();
    Long minutes = duration.toMinutes() - (hours * Constants.MINUTES_IN_AN_HOUR);
    return String.format("%d:%d", hours, minutes);

}

它适用于主要案例,但我在以下情况下有错误:

  • message.getIn()返回:12:59
  • message.getOut()返回:22:00

两者都是同一天,我期待的差异是9:01,但我得到 -14:-59

调试代码我意识到外出时间已经过了04:00,并且进入了18:59。

对于几乎所有情况,它运作良好但在某些情况下会发生。

2 个答案:

答案 0 :(得分:2)

我认为您的问题是您使用的是LocalTime类,但您应该使用LocalDateTime类。它表示你的时区是格林威治标准时间+6,所以在你的例子中你的时间和出时间在不同的日子里 - 你在前一天晚上的时间和第二天早上的时间。但是因为你正在使用LocalTime,所以你会在不同的日子里失去这些事实。将您的LocalTime更改为LocalDateTime,看看是否有帮助

答案 1 :(得分:0)

你工作太辛苦了,在你的代码中经历了太多的旋转。

使用Instant

你有一对Instant start = … ; Instant stop = … ; Duration d = Duration.between( start , stop ); 个对象,但扔掉它们。使用它们。瞬间是UTC时间轴上的特定时刻,分辨率为纳秒。

java.util.Date

你如何得到你的瞬间是一个谜。如果您修改问题以解释输入的确切性质,我将在此处提供更多代码。

如果您传递了一对Instant个对象,请将它们转换为Instant start = utilDateX.toInstant() ; Instant stop = utilDateY.toInstant() ; Duration d = Duration.between( start , stop ); 。使用添加到旧日期时间类的新转换方法。根本不需要时区来计算经过的时间。

LocalTime

使用users uid_001 email: "dr@who.com" name: "Dr. Who" fav_food: "Jelly Babies" uid_002 email: "homer@simpsons.com" name: "Homer Simpson" fav_food: "Doughnuts" 计算已用时间很少是合适的,因为它会延续到下一天或前几天。