Нельзя ли помочь найти ошибку в коде Java по получению диапазона дат за месяц?
Вывожу в консоль диапазон дат за месяц, для примера указан Апрель 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));
}