从午夜开始,我想按照一定周期长度的步骤迭代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
}
此外,上述周期等于一天的倍数(无限循环)失败,或者,如果大于一天,则返回数字,就好像周期被强制转换为短于一天一样,(例如,24hr10min 的行为与 10Minutes) 相同),所以如果可以同时修复(没有明确的if
),我也会接受它。
我认为乔达斯蒂芬的答案是正确的,实施起来不是很困难,并且是一个完整的解决方案,也可以修复任何边缘情况:
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)没有提供这个功能,并且在编码你的特殊情况时也没有很短的时间。
用户在这里唯一可以抱怨的是缺乏内置的流和时间间隔支持,包括重复,这可能会在不循环的情况下实现更短的解决方案。
没有内置代码来支持这种迭代。
使用该LocalTime
LocalDateTime
可能更容易,因为它可以更好地处理结束条件(如果没有明显的日期可供使用,请使用任意日期,然后循环直到日期是下一个日期。