1

LocalTime从午夜开始,我想以一定的周期长度迭代s 到一天结束。

例如。如果时间段是 8hr10Minutes 我想要时间: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
}

此外,对于等于一天的倍数(无限循环)的时间段,上述操作失败,或者,如果大于一天,则返回数字,就好像时间段被强制转换为短于一天一样,(例如,24hr10min 的行为与 10Minutes 相同),所以如果可以同时修复(没有明确if的 s)我也会接受它。

4

2 回答 2

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

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

于 2015-01-10T20:27:27.007 回答
2

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

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

于 2015-01-10T11:45:40.193 回答