Нельзя ли помочь найти ошибку в коде Java по получению диапазона дат за месяц?

Рейтинг: -1Ответов: 1Опубликовано: 14.04.2023

Вывожу в консоль диапазон дат за месяц, для примера указан Апрель 2017. Но, в результате код выводит бОльшее количество дат, нежели мне нужно, он почему-то прогоняет месяц Апрель несколько раз по циклу. Список получается слишком длинный. Мне нужно просто вывести с 1-го апреля по 30-е. Не могу понять, какая ошибка в коде.

Код у меня вот такой:

import java.time.LocalDate;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
// April 2017
YearMonth ym = YearMonth.of(2017, 4);
// get the last day of month
int lastDay = ym.lengthOfMonth();
// loop through the days
for(int day = 1; day <= lastDay; day++) {
    // create the day
    LocalDate dt = ym.atDay(day);
    // set to midnight at JVM default timezone
    do {
        System.out.println(dt.format(DateTimeFormatter.ofPattern("dd.MM.yyyy")));
        dt = dt.plusDays(1);

    } while (dt.getDayOfMonth() > 1);
        }
    }
}

Ответы

▲ 1Принят

Как указал в комментарии Петр Абдулин, проблема связана с вложенным циклом do-while, который печатает каждый раз даты до конца месяца, начиная от текущей даты dt. Также в цикле каждый раз создаётся экземпляр DateTimeFormatter, что совершенно излишне.

Более того, основной цикл for можно переписать, используя LocalDate и его методы для итерации, реализовав отдельный метод:

public static void printMonthDays(YearMonth ym) {
    DateTimeFormatter ddMMyyyy = DateTimeFormatter.ofPattern("dd.MM.yyyy");
    for (LocalDate dt = ym.atDay(1), to = dt.plusMonths(1); dt.isBefore(to); dt = dt.plusDays(1)) {
        System.out.println(dt.format(ddMMyyyy));
    }
}

public static void main(String[] args) {
    printMonthDays(YearMonth.of(2017, 4));
}