본문 바로가기

JAVA

매월 n주차 요일날짜 및 매주 특정요일 날짜 가져오기

  • SO(국제표준) 주차계산법을 활용하여 해당월의 첫번째 목요일이 달력상으로 이전달에 있는지 현재달에 있는지를 구분하여 첫번째 주차값을 구한다 (https://antennagom.com/844)
  • ex) 현재날짜로부터 5년간 매월 첫째주 월요일의 날짜값 가져오기
  • ex) 현재날짜로부터 5년간 매주 월요일 날짜값 가져오기

1. 메소드 정의

/**
     * 오늘날짜를 시작으로 n개월 만큼 해당월의 n주차 n요일의 값을 날짜형식으로 변환후 리스트로 가지고온다
     * 사용법 : List<String> list = getListDayOfMonth("1", "월요일", "60");       // 5년동안 매월 첫번째주의 월요일날짜를 가지고 오겠다
     *
     * -----------------------------------------------------------------------------------------------------------------
     * ※ 국제표준화(ISO)를 기반으로 월(月) 주차 계산을 한다
     *      (그 주의 목요일이 다음달인경우 다음달의 주차로 계산)
     *
     *      예시1) 2023년 3월 첫번째주 월요일은 2월27일 이다 (1주차 : 2023.2.27 ~ 2023.3.5)
     *          - 달력기준으로 2023년 3월을 열었을때 목요일이 3월에 포함되어있다면 달력(행)의 기준으로 그 주의 첫번째 월요일을 구한다
     *
     *      예시2) 2023년 4월 첫번째주 월요일은 4월3일 이다 (1주차 : 2023.4.3 ~ 2023.4.9)
     *          - 달력기준으로 2023년 4월달을 열었을때 목요일이 4월에 포함되어 있지 않기에 그다음주의 첫번째 월요일날짜를 가져온다
     * -----------------------------------------------------------------------------------------------------------------
     *
     * @param wk    몇번째 주의 요일을 가져오겠다  (1주차, 2주차...)
     * @param day   특정요일을 가지고오겠다 (월요일 or MONDAY or MON)
     * @param m     총 몇개월치를 가지고 오겠다    (12 = 1년,  15 = 1년3개월, 60 = 5년)
     * @return      yyyy-mm-dd 형태의 날짜리스트
     */
    public static List<String> getListDayOfMonth(String wk, String day, String m) {

        // wkFlag = 0 매주, 1 = 1주차, 2 = 2주차.. 5 = 5주차 (매주 / n월주차 flag값)
        int wkFlag = Integer.parseInt(wk);

        // 결과를 반환할 list
        List<String> list = new ArrayList<>();

        // 현재 날짜 구하기 (시스템 시계, 시스템 타임존)
        LocalDate now = LocalDate.now();

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

        // n월주차 (1~5주차까지)
        if(wkFlag != 0) {

            // 1. 첫째주 목요일값을 가져오는 Calendar 객체
            Calendar c1 = Calendar.getInstance();

            int year = now.getYear();
            int month = now.getMonthValue()-1;
            int week = Integer.parseInt(wk);
            int thursDayMonth = 0;

            // 총 몇개월치의 데이터를 구할건지
            int mm = Integer.parseInt(m);

            for(int i=0; i<=mm; i++) {

                // 12월인경우 내년1월로 초기화 한다
                if(month == 12) {
                    year++;
                    month = 0;  // (month = 0   1월)
                }

                c1.set(Calendar.YEAR, year);
                c1.set(Calendar.MONTH, month);          // 0 = 1월, 11 = 12월
                c1.set(Calendar.WEEK_OF_MONTH, week);   // 해당월의 n주차 ( week=1주차, (week+1)=2주차, (week+2)=3주차 )
                c1.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);

                // 당월의 첫번째주 목요일값 가져오기  ( 달력기준으로 n월의 첫번째 행에 목요일이 전월에있는지 당월에있는지 구분짓기 위한 변수 )
                thursDayMonth = Integer.parseInt(formatter.format(c1.getTime()).substring(5, 7));

                // yyyy-mm-dd 결과값을 담을 변수
                String result = "";

                // 2. 첫째주 n요일값을 가져오는 Calendar 객체
                Calendar c2 = Calendar.getInstance();
                c2.set(Calendar.YEAR, year);
                c2.set(Calendar.MONTH, month);

                if (thursDayMonth != month) {                       // 첫번째주 목요일이 당월과 '다르다면' 달력기준으로 해당주의 월요일값을 가져온다 (변수month는 실제월 - 1)
                    c2.set(Calendar.WEEK_OF_MONTH, week);
                    c2.set(Calendar.DAY_OF_WEEK, getDayOfWeek(day));    // 요일의 정수값을 반환
                    result = formatter.format(c2.getTime());

                } else {                                            // 첫번째주 목요일이 당월과 '같다면' 달력기준으로 그다음주의 월요일값을 가져온다 (변수month는 실제월 - 1)
                    c2.set(Calendar.WEEK_OF_MONTH, week + 1);
                    c2.set(Calendar.DAY_OF_WEEK, getDayOfWeek(day));    // 요일의 정수값을 반환
                    result = formatter.format(c2.getTime());
                }

                month++;    // 반복문 한번돌면 '월'의 값을 1증가

                //System.out.println(year + "년 " + month + "월의 " + wk + "째주 "+day+"요일 : " + result);
                list.add(result);

            }

        // 매주 특정요일 구하기
        } else {

            int year = now.getYear();
            int month = now.getMonthValue()-1;
            int week = Integer.parseInt(wk);

            // 총 몇개월치의 데이터를 구할건지
            int mm = Integer.parseInt(m);

            for(int i=1; i<=mm; i++) {

                // yyyy-mm-dd 결과값을 담을 변수
                String result = "";

                // 2. 매주 n요일값을 가져오는 Calendar 객체
                Calendar c2 = Calendar.getInstance();
                c2.set(Calendar.YEAR, year);
                c2.set(Calendar.WEEK_OF_MONTH, week + i);
                c2.set(Calendar.DAY_OF_WEEK, getDayOfWeek(day));    // 요일의 정수값을 반환
                result = formatter.format(c2.getTime());

                month++;    // 반복문 한번돌면 '월'의 값을 1증가

                //System.out.println(year + "년 " + month + "월의 " + wk + "째주 "+day+"요일 : " + result);
                list.add(result);
            }
        }

        return list;
    }

    /**
     * 전날, 다음날로 날짜변경
     * @param paramDate  날짜 (yyyy-MM-dd)
     * @param nextDay    받은 값만큼 다음날, 전날로 날짜변경
     * @return
     * @throws ParseException
     */
    public String getNextDay(String paramDate, int nextDay) throws ParseException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date dt = sdf.parse(paramDate);

        Calendar c = Calendar.getInstance();
        c.setTime(dt);
        c.add(c.DATE, nextDay); // nextDay만큼 날짜를 변경(1=다음날,  -1=전날)

        // date타입을 포맷한 결과값을 담는다
        String resultDt = sdf.format(c.getTime());

        return resultDt;
    }

    /**
     * 입력받은 요일을 Calendar객체로 변환하여 특정요일의 정수값을 반환한다 (0=일요일 ~ 7=토요일)
     * @param day
     *          EX) day = 월요일, Monday, mon   입력할경우 월요일의 정수값 1을 반환
     * @return
     */
    public static int getDayOfWeek(String day) {

        int dayNum = 0;

        if(day.length() == 1) {
            return dayNum;
        }

        String dayKor = day.substring(0, 1);                // 한글첫번째값
        String dayEng = day.substring(0, 3).toUpperCase();  // 영어 세번째자리까지 대문자로 치환

        Calendar c = Calendar.getInstance();

        if(dayKor.equals("월") || dayEng.equals("MON")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("화") || dayEng.equals("TUE")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("수") || dayEng.equals("WED")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("목") || dayEng.equals("THU")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("금") || dayEng.equals("FRI")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("토") || dayEng.equals("SAT")) {
            c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else if(dayKor.equals("일") || dayEng.equals("SUN")){
            c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);

        } else {
            c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            dayNum = c.get(Calendar.DAY_OF_WEEK);
        }

        return dayNum;
    }

    /**
     * 파라미터로 받은 날짜의 해당 요일의 정수값 반환 (1=일요일 ... 7=토요일)
     * @param date
     * @return
     * @throws Exception
     */
    public int getDateDayNum(String date) throws Exception {

        String day = "";

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd") ;
        java.util.Date nDate = dateFormat.parse(date);
        Calendar cal = Calendar.getInstance();
        cal.setTime(nDate);
        int dayNum = cal.get(Calendar.DAY_OF_WEEK);

        return dayNum;
    }

 

2. 메소드 사용법

// 현재날짜로부터 매월 첫째주 월요일을 총 60개월간 구하겠다
List<String> weekList = getListDayOfMonth("1", "MON", "60");

// 현재날짜로부터 매주 월요일을 총 60개월간 구하겠다   (첫번째 인수에 0을 넣을시 매주로 계산 / 그외 1~5를 입력시 입력된 주차로 계산)
List<String> weekList = getListDayOfMonth("0", "MON", "60");

 

코드가 좀 지저분하지만 회사에서 만들어야 할 일이 생겨 만들었다

'JAVA' 카테고리의 다른 글

Java) 몇분, 몇시간, 몇일 지났는지 알아내기  (0) 2021.11.09