假设以下代码段:
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来映射数据库。
答案 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数据类型作为值。您需要一个Duration
。 Duration
是Period
的时间级别对应对象:
基于时间的时间量,例如“ 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)。