알이즈웰
달의 마지막 날 찾기 본문
달의 마지막 날 찾기
입력된 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
날짜 뽑을 일이 있다면 항상 주의하도록 하자.
'Programming > JAVA' 카테고리의 다른 글
날짜 변환 관련(LocalDate, LocalDateTime) (0) | 2019.06.12 |
---|---|
함수 호출 다이어그램 (0) | 2018.10.04 |
poi 사용하여 Java로 엑셀파일 생성 (2) | 2017.07.13 |
Java의 객체, 클래스, 인스턴스, 생성자 (0) | 2017.07.05 |
상수 인터페이스 지양 (0) | 2017.07.05 |
Comments