Java - 计算小时差 - 特定方案

时间:2017-04-12 20:04:31

标签: java time

我只想用分钟来计算时差,希望已经有一个正确的类。 因此,我从网站获得的价值仅为小时和分钟(例如:活动开始位于: 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'

2 个答案:

答案 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

请参阅此code run live at IdeOne.com