본문 바로가기

카테고리 없음

JAVA 로 KS X ISO8601을 따라 특정 월 주차 구하기

getFirstWeekInMonth(int year, int month) : 년도와 월을 입력받아 해당 월의 첫 주가 년도의 몇번째 주인지 반환

getLastWeekInMonth(int year, int month) : 년도와 월을 입력받아 해당 월의 마지막 주가 년도의 몇번째 주인지 반환

표준번호 KS X ISO8601을 따라 월의 첫번째 목요일이 있는 주가 첫째 주
import java.io.IOException;
import java.util.Calendar;

public class Main{

    public static void main(String[] args) throws IOException {
        for (int i = 1; i <= 12; i++) {
            System.out.println("2022년 " + i + "월 :");
            int firstWeekInMonth = getFirstWeekInMonth(2022, i);
            int lastWeekInMonth = getLastWeekInMonth(2022, i);
            System.out.println(firstWeekInMonth + " ~ " + lastWeekInMonth);
        }
    }

    public static int getFirstWeekInMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY); // 주의 시작을 월요일로 세팅
        /**
         * 표준번호 KS X ISO8601 을 따라 첫 목요일이 있는 주가 첫째 주
         * -> 첫주는 최소 4일 이상을 포함하고 있음
         */
        cal.setMinimalDaysInFirstWeek(4); // 첫주의 최소 날을 4일로 세팅

        cal.set(Calendar.YEAR, year); // 연도 세팅
        cal.set(Calendar.MONTH, month - 1); // Calendar 는 1~12일이 아닌 0~11이기 때문에 -1하여 세팅
        cal.set(Calendar.WEEK_OF_MONTH, 1); // 그 달의 첫 주 세팅


        /**
         * cal을 월요일과 일요일로 옮겨 첫 주가 며칠부터 며칠까지인지 확인하기
         */
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONTH);
        int calMonth = cal.get(Calendar.MONTH) + 1;
        System.out.print("first week start with :" + calMonth + "/" + cal.get(Calendar.DAY_OF_MONTH) + " ~ ");
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        calMonth = cal.get(Calendar.MONTH) + 1;
        System.out.println(calMonth + "/" + cal.get(Calendar.DAY_OF_MONTH));

        return cal.get(Calendar.WEEK_OF_YEAR); // 현재 cal이 속한 주가 연도의 몇번 째 주인지 리턴
    }

    public static int getLastWeekInMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY); // 주의 시작을 월요일로 세팅
        /**
         * 표준번호 KS X ISO8601 을 따라 첫 목요일이 있는 주가 첫째 주
         * -> 첫주는 최소 4일 이상을 포함하고 있음
         */
        cal.setMinimalDaysInFirstWeek(4); // 첫주의 최소 날을 4일로 세팅
        cal.set(Calendar.YEAR, year); // 연도 세팅
        cal.set(Calendar.MONTH, month - 1); // Calendar 는 1~12일이 아닌 0~11이기 때문에 -1하여 세팅
        cal.set(Calendar.WEEK_OF_MONTH, cal.getActualMaximum(Calendar.WEEK_OF_MONTH)); // 그 달의 마지막주 세팅


        /**
         * Calendar는 KS X ISO8601을 따르지 않음 -> 마지막주로 세팅하면 이상한 값이 나올 수 있음
         * 그러므로 cal 목요일로 이동하였을 때 cal의 설정된 달이 입력으로 받은 달이 아니라면 한주를 앞으로 땡겨옴
         */
        cal.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
        int calMonth = cal.get(Calendar.MONTH) + 1;
        if (calMonth != month) {
            cal.add(Calendar.WEEK_OF_MONTH, -1);
        }

        /**
         * cal을 월요일과 일요일로 옮겨 첫 주가 며칠부터 며칠까지인지 확인하기
         */
        calMonth = cal.get(Calendar.MONTH) + 1;
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONTH);
        System.out.print("Last week start with :" + calMonth + "/" + cal.get(Calendar.DAY_OF_MONTH) + " ~ ");
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        calMonth = cal.get(Calendar.MONTH) + 1;
        System.out.println(calMonth + "/" + cal.get(Calendar.DAY_OF_MONTH));

        return cal.get(Calendar.WEEK_OF_YEAR);
    }
}