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);
}
}