- 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 |
---|