[JAVA] 달력 만들기

0

public class CalendarUtils {
    
    public static final DayOfWeek FIRST_DAY_OF_WEEK = DayOfWeek.SUNDAY;
    
    public static final DayOfWeek LAST_DAY_OF_WEEK = DayOfWeek.SATURDAY;
    

    /**
     * 해당 월의 달력 데이터를 가져온다.
     *
     * @param date
     * @return
     */
    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);
    }


    /**
     * 해당 월의 달력 데이터를 가져온다.
     *
     * @param year
     * @param month
     * @param fillEmptyDays
     * @return
     */
    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);
            // 다음 달의 1일부터 주의 마지막 요일까지 +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;

    }
}


0개의 댓글