结果超过 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
假设以下片段:
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