알이즈웰

달의 마지막 날 찾기 본문

Programming/JAVA

달의 마지막 날 찾기

2017. 7. 10. 17:37


달의 마지막 날 찾기


입력된 yyyyMMddHHmm형의 날짜를 가져와서, 현재 날짜(배치가 동작하는 날짜)와 비교하여,

현재 날짜가 입력된 날짜보다 이르다면 배치 처리가 동작하지 않는 코드이다.


부가설명 : 엑셀파일에 데이터를 뽑을 시작일자와 종료일자를 입력하면 엑셀파일로부터 그 날짜를 읽어와서 해당되는 기간 안의 데이터만 뽑아 엑셀파일을 생성하는 기능이다. 배치는 매일 작동하는건데, 종료일자가 도래하지않았다면 엑셀파일을 생성하지 않고 skip한다.


문제 : 1번처럼 하면, 입력(endDate)이 예시와 같이 해당 달의 마지막 날짜보다 초과된 일자로 입력될 경우 초과된 일자 수 만큼 날짜가 더해져서 변환된다는 것.


ex. 6월 31일로 입력되면, 7월 1일로 변환됨/2월 30일로 입력되면(윤달 아닐경우) 3월 2일로 변환됨


해서, 2번과 같이 일자는 따로 계산해서 뽑아줘야한다.

사용한 함수는  getActualMaximum


String endDate = "201706310500";

// 1번	
Calendar cur = Calendar.getInstance();
Calendar end = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm");
end.setTime(sdf.parse("201706310500"));
System.out.println("sdf : "+sdf.parse(endDate));
System.out.println("cur : "+cur.getTime()+", end : "+end.getTime());

System.out.println("====================================================");

// 2번
Calendar maxDay = Calendar.getInstance();
maxDay.setTime(new SimpleDateFormat("yyyyMM").parse(endDate.substring(0,6)));
System.out.println("endDate : "+endDate+", maxDay.toString() : "+maxDay.getTime());
int maxDayInt = maxDay.getActualMaximum(maxDay.DAY_OF_MONTH);
System.out.println("maxDayInt : "+maxDayInt);
end.setTime(sdf.parse(endDate.substring(0,6)+maxDayInt+"0000"));

if(cur.before(end)) {
     continue;
}


결과


sdf : Sat Jul 01 05:00:00 KST 2017

cur : Mon Jul 10 17:19:43 KST 2017, end : Sat Jul 01 05:00:00 KST 2017

====================================================

endDate : 201706310500, maxDay.toString() : Thu Jun 01 00:00:00 KST 2017

maxDayInt : 30



날짜 뽑을 일이 있다면 항상 주의하도록 하자.








Comments