我已经找到了如何获得两个日期和分钟之间的小时数。我想要的是两者之间的确切差异,这是我使用的代码:
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);
}
它适用于主要案例,但我在以下情况下有错误:
两者都是同一天,我期待的差异是9:01,但我得到 -14:-59
调试代码我意识到外出时间已经过了04:00,并且进入了18:59。
对于几乎所有情况,它运作良好但在某些情况下会发生。
答案 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"
计算已用时间很少是合适的,因为它会延续到下一天或前几天。