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

ath*_*r99 3 java time duration date hour

假设以下代码段:

LocalTime test = LocalTime.of(21, 14);
test.plusHours(5);
Run Code Online (Sandbox Code Playgroud)

结果通常是,02:14但我希望超过24小时限制,所以结果将是26:14.

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

有没有办法在java.timeAPI中实现这一目标?如果没有,我该怎么做才能实现这一目标?我正在使用Java 8,使用Spring Boot和Hibernate来映射数据库.

Dod*_*ion 5

要指定任务所需的时间,请使用持续时间:

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());
Run Code Online (Sandbox Code Playgroud)

更新:正如Ole VV指出的那样,toMinutesPart在Java 9中添加了.如果仍然使用Java 8,请使用toMinutes()%60.


ern*_*t_k 5

java.time.Duration

您正在使用wront数据类型作为值.你需要一个Duration.Duration是时间级别的对应物Period:

基于时间的时间量,例如'34.5秒'.

Duration durationTaken = Duration.of(5, ChronoUnit.HOURS);
Run Code Online (Sandbox Code Playgroud)

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

LocalTime endTime = test.plus(durationTaken); //02:14
Run Code Online (Sandbox Code Playgroud)

你也可以这样做LocalDateTime:

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

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

  • @ athosbr99"持续时间"类被设计为一对整数:整个持续时间的总秒数加上小数秒的纳秒数.所以,是的,将持续时间存储为长整数是有意义的,如果你愿意牺牲小数秒,并且假设Postgres将`BIGINT`实现为64位整数(不幸的是,SQL标准没有指定长度).当我建议使用ISO 8601文本格式时,我想起了"期间"这个月 - 月 - 天,它*不*转换为像"持续时间"那样的特定数字. (2认同)