代码之家  ›  专栏  ›  技术社区  ›  wannaBeDev

在for循环中为Java LocalTime添加固定的分钟数,直到午夜,而不会导致无限循环

  •  0
  • wannaBeDev  · 技术社区  · 2 月前

    给定a LocalTime 添加 n 到午夜还有几分钟,然后把这些时间打印到控制台上。例子:

    public static void main(String[] args) {
    
        LocalTime start    = LocalTime.of(10, 12, 0);
        LocalTime midnight = LocalTime.of(23, 59, 59);
    
        for (LocalTime t = start; t.isBefore(midnight); t = t.plusMinutes(30)) {
            System.out.println(t);
        }
    }
    

    预期:

    10:12
    10:42
    11:12
    11:42
    12:12
    ...
    ...
    21:42
    22:12
    22:42
    23:12
    23:42
    

    上述结果形成了一个无限循环。如何避免?

    2 回复  |  直到 2 月前
        1
  •  2
  •   VGR    2 月前

    正如你所观察到的, t.isBefore(midnight) 这是不够的,因为几乎每个LocalTime值都会满足该条件。

    你真正想要的是确定增加30分钟是否会导致时间 较少的 比当前值 t :

    for (LocalTime t = start; t.isBefore(t.plusMinutes(30)); t = t.plusMinutes(30)) {
    

    这将在增加30分钟时停止循环 t 导致值小于 t 这只能在一天结束时增加分钟数时发生。

    但它并不完美,因为它不会打印当天的最后一个值。你可以用第二个变量来跟踪上一次:

    LocalTime previous = null;
    for (LocalTime t = start;
         previous == null || previous.isBefore(t);
         previous = t, t = t.plusMinutes(30)) {
    
        System.out.println(t);
    }
    
        2
  •  0
  •   June    2 月前

    作为 LocalTime 文档状态, LocalTime is an immutable date-time object that represents a time, often viewed as hour-minute-second. 当地时间 没有一天的概念,因此23:59:59是 当地时间 。循环只有在经过几次添加后最终变为23:59:59时才会停止。或者,您可以使用 LocalDateTime 让它知道这一天。例如:

            LocalDateTime start = LocalDateTime.of(2024, 12, 24, 10, 12, 0);
            LocalDateTime midnight = LocalDateTime.of(2024, 12, 24, 23, 59, 59);
            for (LocalDateTime t = start; t.isBefore(midnight); t = t.plusMinutes(30)) {
                System.out.println(LocalTime.from(t));
            }
    

    上面的代码将打印您想要的内容,并正常停止:

    10:12
    10:42
    ...
    23:12
    23:42