总时间超过24小时

时间:2019-02-07 17:34:29

标签: java date time duration hour

假设以下代码段:

LocalTime test = LocalTime.of(21, 14);
test.plusHours(5);

结果通常是02:14,但我想求和超过24小时的限制,所以结果将是26:14

在这种情况下,我有一个字段,用户可以输入在任务上花费了多少时间。但是我必须工作几个小时(例如48小时)而不是几天(例如2天4个小时)。

有没有一种方法可以在java.time API中实现?如果没有,我该怎么做?我正在使用Java 8,Spring Boot和Hibernate来映射数据库。

3 个答案:

答案 0 :(得分:5)

要指定任务花费的时间,请使用Duration

Duration initialDuration = Duration.ofHours(21).plusMinutes(34);
Duration afterFurtherWork = initialDuration.plusHours(5);
System.out.printf("Total duration was %2d hours and %02d minutes.%n",
        afterFurtherWork.toHours(), afterFurtherWork.toMinutesPart());

更新:作为Ole V.V.指出,toMinutesPart是在Java 9中添加的。如果仍在使用Java 8,请使用toMinutes()%60

答案 1 :(得分:5)

java.time.Duration

您正在使用wront数据类型作为值。您需要一个DurationDurationPeriod的时间级别对应对象:

  

基于时间的时间量,例如“ 34.5秒”。

Duration durationTaken = Duration.of(5, ChronoUnit.HOURS);

如果要将其与日期概念相关联(例如计算结束时间),则可以plus持续时间为日期/时间类型:

LocalTime endTime = test.plus(durationTaken); //02:14

您也可以使用LocalDateTime来做到这一点:

LocalDateTime startTime = LocalDateTime.of(LocalDate.now(), test); //2019-02-07T21:14

//add the duration:
LocalDateTime endDate = startTime.plus(durationTaken); //2019-02-08T02:14

答案 2 :(得分:2)

LocalTime不支持此功能。它有一个静态初始化程序,其中一些规则会在24小时左右烘烤。

/**
 * Constants for the local time of each hour.
 */
private static final LocalTime[] HOURS = new LocalTime[24];
static {
    for (int i = 0; i < HOURS.length; i++) {
        HOURS[i] = new LocalTime(i, 0, 0, 0);
    }
    MIDNIGHT = HOURS[0];
    NOON = HOURS[12];
    MIN = HOURS[0];
    MAX = new LocalTime(23, 59, 59, 999_999_999);
}

根据您更新的评论,我可能建议将小时数转换为您的最低时间值,即使用TimeUnit.HOURS.toMinutes(value)。