Java 8 时间:以周期步长迭代一天的 LocalTime

Java 8 time: Iterate over a day's LocalTime in period steps

提问人:Philipp 提问时间:1/10/2015 最后编辑:JodaStephenPhilipp 更新时间:1/11/2015 访问量:3002

问:

从午夜开始,我想以一定时间段长度的步长遍历 s,直到一天结束。LocalTime

例如。如果时间段是 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 分钟相同),所以如果可以同时修复(没有明确的 s),我也会接受它。if

java 时间 localtime java-time threetenbp

评论

0赞 Peter Lawrey 1/10/2015
我不认为它会很简单,因为时钟确实使用时钟算术。

答:

2赞 JodaStephen 1/10/2015 #1

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

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

4赞 Meno Hochschild 1/11/2015 #2

我认为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

不使用任意日期对结束条件进行建模的解决方案需要具有计算天数溢出的功能,如果滚动 .但是这个功能不是JSR-310(java.time-package)提供的,而且在编码你的特殊情况时也没有真正缩短。LocalTime

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