结果超过 24 小时的时间总和

Sum of time with result more than 24 hours

假设以下片段:

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 来映射数据库。

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)。

要指定任务需要多长时间,请使用 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

java.time.Duration

您为值使用了错误的数据类型。你需要 Duration. Duration is the time-level counterpart of Period:

A time-based amount of time, such as '34.5 seconds'.

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

如果您想将其与日期概念相关联,例如计算结束时间,您可以 plus 持续时间到 date/time 类型:

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