public class CalendarUtils {
public static final DayOfWeek FIRST_DAY_OF_WEEK = DayOfWeek.SUNDAY;
public static final DayOfWeek LAST_DAY_OF_WEEK = DayOfWeek.SATURDAY;
public static List<LocalDate> getCalendarDates(LocalDate date) {
return getCalendarDates(date.getYear(), date.getMonthValue(), false);
}
public static List<LocalDate> getCalendarDates(int year, int month) {
return getCalendarDates(year, month, false);
}
public static List<LocalDate> getCalendarDates(int year, int month, boolean fillEmptyDays) {
LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
DayOfWeek firstDayOfWeek = firstDayOfMonth.getDayOfWeek();
int lastDayOfMonth = firstDayOfMonth.lengthOfMonth();
List<LocalDate> calendar = new ArrayList<>();
if (fillEmptyDays) {
LocalDate lastDayOfPreviousMonth = firstDayOfMonth.minusDays(1);
int emptyDays = firstDayOfWeek.getValue() % 7;
for (int i = 1; i <= emptyDays; i++) {
int day = lastDayOfPreviousMonth.getDayOfMonth() - emptyDays + i;
calendar.add(LocalDate.of(year, month - 1, day));
}
}
for (int dayOfMonth = 1; dayOfMonth <= lastDayOfMonth; dayOfMonth++) {
calendar.add(LocalDate.of(year, month, dayOfMonth));
firstDayOfWeek = firstDayOfWeek.plus(1);
}
if (fillEmptyDays) {
LocalDate firstDayOfNextMonth = firstDayOfMonth.plusMonths(1);
while (FIRST_DAY_OF_WEEK != firstDayOfNextMonth.getDayOfWeek()) {
calendar.add(firstDayOfNextMonth);
firstDayOfNextMonth = firstDayOfNextMonth.plusDays(1);
}
}
return calendar;
}
public static List<LocalDate> getDayOfWeek(int year, int month, int dayOfMonth) {
LocalDate targetDate = LocalDate.of(year, month, dayOfMonth);
LocalDate startOfWeek = targetDate.with(TemporalAdjusters.previousOrSame(FIRST_DAY_OF_WEEK));
LocalDate endOfWeek = targetDate.with(TemporalAdjusters.nextOrSame(LAST_DAY_OF_WEEK));
return createDayOfWeek(startOfWeek, endOfWeek);
}
private static List<LocalDate> createDayOfWeek(LocalDate startOfWeek, LocalDate endOfWeek) {
List<LocalDate> weekDates = new ArrayList<>();
while (startOfWeek.isBefore(endOfWeek.plusDays(1))) {
weekDates.add(startOfWeek);
startOfWeek = startOfWeek.plusDays(1);
}
return weekDates;
}
}