查找小时数

时间:2017-02-01 22:00:32

标签: java date time duration

我想计算几小时之间的持续时间。

SimpleDateFormat defaultFormat = new SimpleDateFormat("HH:mm");
Date hour1 = defaultFormat.parse(time1);
Date hour2 = defaultFormat.parse(time2);
duration = (time2.getTime() - time1.getTime()) / (1000*60); //to minutes
/* hours= duration/60 (hours)  minutes = duration%60 (minutes)

特别是当例如hour1是“22:15”而hour2是“01:15”时会出现问题。上面的代码保存为“duration = 1260”(21小时)。

如何在没有任何错误的情况下找到两小时之间的差异?

4 个答案:

答案 0 :(得分:0)

请注意,您可能会遇到夏令时区转换日期,然后23:00和3:00之间的差异可能是4小时,3小时或5小时。 我建议您在Java 7中使用JodaTime DurationPeriod类或similar API in Java 8

答案 1 :(得分:0)

我建议您在Android或任何其他Java应用中操作日期和时间时使用Joda-Time。它比本机Java日期类强大得多。

以下是使用Joda-Time的示例:

DateTime startTime;
DateTime endTime;
Period p = new Period(startTime, endTime);
int hours = p.getHours();
int minutes = p.getMinutes();

答案 2 :(得分:0)

功能,而不是错误。

您不恰当地使用日期时间类来表示时间值。此外,您正在使用麻烦的旧date-time类,现在是旧的,取而代之的是java.time类。

LocalTime类用于仅限时间的值,没有日期且没有时区或偏移量。

LocalTime lt = LocalTime.of( "22:15" ) ;

您可以使用Duration课程进行数学运算。

Duration d = Duration.of( startLocalTime , stopLocalTime );

使用仅限时间的值的捕获是昼夜不停,越过午夜。没有日期的背景,你怎么能期望一个正确的结果?来自" 22:15"到" 01:15"你是想进入第二天,下一周还是第二年?

Duration课程采取不跨越午夜的方法。 LocalTime的值范围总共为二十四小时,从00:00的{​​{1}}到23:59:59.999999999的{​​{3}}。因此,从较晚时间到较早时间的唯一方法是及时向前行驶到较早点,导致负数。

LocalTime start = LocalTime.parse ( "22:15" );
LocalTime stop = LocalTime.parse ( "01:15" );
Duration d = Duration.between ( start , stop );

转储到控制台。

System.out.println ( "start/stop: " + start + "/" + stop );
System.out.println ( "d.toString(): " + d );
  

开始/停止:22:15/01:15

     

d.toString():PT-21H

该输出为标准minimum

如果您想计算时间轴上实际时刻之间的时间跨度,请搜索java.timeDurationPeriodmaximum,{{3 }},OffsetDateTimeInstantInterval和“已过去”。 很多次已经涵盖了这个主题。

作为一个简单的例子,让我们在ISO 8601 format for durations区域分配一些从今年1月23日到24日的任意日期。结果是三小时的经过时间。由于ZonedDateTime等异常,此结果可能因日期和区域而异

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtStart = ZonedDateTime.of( 2017, 1, 23, 22, 15, 0, 0 , z );
ZonedDateTime zdtStop = ZonedDateTime.of( 2017, 1, 24, 01, 15, 0, 0 , z );
Duration d = Duration.between( zdtStart , zdtStop );
  

zdtStart.toString():2017-01-23T22:15-05:00 [美国/蒙特利尔]

     

zdtStop.toString():2017-01-24T01:15-05:00 [美国/蒙特利尔]

     

d.toString():PT3H

ZoneId

关于java.time

America/Montreal框架内置于Java 8及更高版本中。这些类取代了麻烦的旧Daylight Saving Time (DST)日期时间类,例如code run live at IdeOne.comjava.time和& legacy

现在位于java.util.DateCalendar项目建议迁移到SimpleDateFormat类。

要了解详情,请参阅Joda-Time。并搜索Stack Overflow以获取许多示例和解释。规范是maintenance mode

从哪里获取java.time类?

Android项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如ThreeTenABPHow to use ThreeTenABP…ThreeTen-ExtraInterval

答案 3 :(得分:0)

java.time

您可以使用 java.time.Duration,它以 ISO-8601 standards 为模型,并作为 JSR-310 implementation 的一部分与 Java-8 一起引入。 Java-9 引入了一些更方便的方法。

演示:

import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        LocalTime startTime = LocalTime.parse("22:15");
        LocalTime endTime = LocalTime.parse("01:15");

        LocalDateTime startDateTime = today.atTime(startTime);
        LocalDateTime endDateTime = today.atTime(endTime);

        if (startDateTime.isAfter(endDateTime)) {
            endDateTime = endDateTime.with(LocalTime.MIN).plusDays(1).with(endTime);
        }

        Duration duration = Duration.between(startDateTime, endDateTime);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedDuration = String.format("%02d:%02d:%02d", duration.toHours(), duration.toMinutes() % 60,
                duration.toSeconds() % 60);
        System.out.println(formattedDuration);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedDuration = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedDuration);
        // ##############################################################################
    }
}

输出:

PT3H
03:00:00
03:00:00

Trail: Date Time 了解有关现代日期时间 API 的更多信息。