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

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

从午夜开始,我想按特定周期长度的步长迭代 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
}

此外,上述方法对于等于一天的倍数(无限循环)的周期失败,或者,如果大于一天,returns 数字就好像周期被投射为短于一天, (例如 24 小时 10 分钟与 10 分钟的行为相同),所以如果可以同时修复(没有明确的 ifs)我也会接受它。

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

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

我认为 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)不提供此功能,并且在编写您的特殊情况时也没有真正缩短。

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