Java 8时间:在句点步骤中迭代一天的LocalTime

时间:2015-01-10 10:09:26

标签: java time localtime java-time threetenbp

从午夜开始,我希望以一段特定时间段的步长迭代LocalTime秒到当天结束。

EG。如果时间是8小时10分钟我想要的时间:0:00,8:10,16:20(不是24:30,因为这是第二天)

我有以下工作代码的时间小于一天。是否有更好的(尤其是更易读的)逻辑?

Duration period = ...;
for(LocalTime t = LocalTime.MIDNIGHT, p = LocalTime.MIDNIGHT;
            t.isAfter(p) || t.equals(p) ; p = t, t = t.plus(period)){
    // do something with t
}

此外,上述故障的时间段等于一天的倍数(无限循环),或者,如果大于一天,则返回该数字,就好像该时段被投射为短于一天,(例如,24小时10分钟表现为与10分钟相同),如果可以同时修复(没有明确if s),我也会接受它。

2 个答案:

答案 0 :(得分:3)

我认为JodaStephen的答案是正确的,并不是很难实现,并且是一个完整的解决方案,也可以解决任何边缘案例:

LocalDate date = LocalDate.of(2014, 1, 1); // arbitrary date
LocalDateTime tsp = LocalDateTime.of(date, LocalTime.MIDNIGHT);

do {
    System.out.println(tsp.toLocalTime());
    tsp = tsp.plus(Duration.ofHours(8).plusMinutes(10));
} while (date.equals(tsp.toLocalDate()));

输出:

00:00
08:10
16:20

如果不使用任意日期来模拟结束条件,则需要具有计算日溢出的功能(如果滚动LocalTime)。但JSR-310(java.time-package)不提供此功能,并且在编写特殊情况时也不会更短。

用户在这里唯一可以抱怨的是缺乏内置流和时间间隔支持,包括重复发生,这可能会在没有循环的情况下实现更短的解决方案。

答案 1 :(得分:2)

没有内置代码来支持这种迭代。

使用LocalDateTime LocalTime可能更容易,因为它会更好地处理结束条件(如果没有明显的日期可以使用任意日期,然后循环直到日期为以下日期。)