我只想用分钟来计算时差,希望已经有一个正确的类。 因此,我从网站获得的价值仅为小时和分钟(例如:活动开始位于: 20:30 ,结束位于 03:30 )。
当我使用'Duration.between'时,我得到的值不正确 - 当第一个值大于秒或第二个值超过午夜时会发生这种情况。 我想我可以用'ifs'和'elses'做到这一点,但我确信已经有一个类或方法可以更优雅的方式解决问题,但我找不到它。 这是我的代码:仅当第二个值大于第一个值时才有效:
LocalTime eventStarts = LocalTime.now();
LocalTime eventEnds = LocalTime.now();
eventStarts = eventStarts.withHour(22).withMinute(00);
eventEnds = eventEnds.withHour(03).withMinute(00);
Duration durationBetweenEvents = Duration.between(eventStarts, eventEnds);
System.out.println(durationBetweenEvents.toMinutes());
在这种情况下,我得到'-1140'
答案 0 :(得分:1)
只需在代码中添加以下内容即可。
if (durationBetweenEvents.isNegative()) {
durationBetweenEvents = durationBetweenEvents.plusDays(1);
}
你需要对夏令时小心谨慎。如果夏令时在事件之间开始或结束,则您的计算可以是一小时。但是,如果不知道日期或时区信息,就无法解决这个问题。
答案 1 :(得分:1)
LocalTime
没有日期或日期的概念。所以它仅限于一个通用的24小时工作日。从晚上时间到早上时间被视为时间倒退,而不是因为没有日子而在另一天结束。
要知道实际事件的持续时间,您需要日期和时区。
获取当前日期需要时区。对于任何特定时刻,日期在全球范围内因地区而异。
获得日期后,请应用ZoneId
获取ZonedDateTime
个对象。从那里你可以得到一个考虑到夏令时(DST)等异常的Duration
。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
LocalDate tomorrow = today.plusDays( 1 );
ZonedDateTime zdtStart =
ZonedDateTime.of( today , LocalTime.parse( "20:30" ) , z ) ;
ZonedDateTime zdtStop =
ZonedDateTime.of( tomorrow , LocalTime.parse( "03:30" ) , z ) ;
Duration d = Duration.between( zdtStart , zdtStop ) ;
long totalMinutes = d.toMinutes() ;
zdtStart.toString():2017-04-13T20:30-04:00 [美国/蒙特利尔]
zdtStop.toString():2017-04-14T03:30-04:00 [美国/蒙特利尔]
d.toString():PT7H
totalMinutes:420