이번에는, 문자열 형태의 두 날짜 사이에 존재하는 날짜들을 구하는 예제 (시작 날짜와 끝 날짜 포함) 를 설명드리겠습니다.


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

public class Main {
	public static void main(String[] args) throws ParseException {
		final String DATE_PATTERN = "yyyy-MM-dd";
		String inputStartDate = "2017-02-28";
		String inputEndDate = "2017-03-05";
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
		Date startDate = sdf.parse(inputStartDate);
		Date endDate = sdf.parse(inputEndDate);
		ArrayList<String> dates = new ArrayList<String>();
		Date currentDate = startDate;
		while (currentDate.compareTo(endDate) <= 0) {
			dates.add(sdf.format(currentDate));
			Calendar c = Calendar.getInstance();
			c.setTime(currentDate);
			c.add(Calendar.DAY_OF_MONTH, 1);
			currentDate = c.getTime();
		}
		for (String date : dates) {
			System.out.println(date);
		}
	}
}


1 ~ 5 라인

예제에 필요한 class 들을 import 하는 문장입니다.


9 라인

SimpleDateFormat 객체를 생성할 때 필요한 날짜 패턴 상수입니다. 저는 편의상 "yyyy-MM-dd" 로 지정하였습니다. 입맞에 맞게 변행해서 사용하시면 됩니다.


10 ~ 11 라인

두 날짜 문자열입니다. 7 라인에서 지정한 날짜 패턴의 형태로 두 날짜를 지정해 주면 됩니다. 기본적으로 시작 날짜보다 끝 날짜보다 이전일 수 없다고 가정하겠습니다. 현재 예제에서는 시작 날짜와 끝 날짜를 포함한 그 사이의 모든 날짜들을 구하는 것이 목적입니다.


12 라인

String 형태의 날짜를 Date 형태의 날짜로 편하게 변환하기 위해서 필요한 SimpleDateFormat 객체를 "yyyy-MM-dd" 패턴으로 생성합니다.


13 ~ 14 라인

SimpleDateFormat 객체의 parse 메소드를 통해서 10 ~ 11 라인의 두 String 형태의 날짜를 Date 형태의 날짜로 변경합니다. 이 parse 메소드는 ParseException 을 throws 하고 있습니다. 이 예제에서는 예외 처리가 중심이 아니기 때문에 저 또한 8 라인의 throws ParseException 구문을 통해서 예외 처리를 회피하도록 하겠습니다.


15 라인

날짜들을 저장할 빈 ArrayList 객체를 생성합니다.


16 ~ 23 라인

시작 날짜부터 시작하여 끝 날짜까지 하루씩 증가시키면서 ArrayList 에 날짜를 문자열로 변환하여 저장합니다.


16 라인

currentDate 로 시작 날짜를 가리킵니다.


17 라인

Date 객체의 compareTo 메소드를 통해서 두 날짜의 크기를 비교합니다. X.compareTo(Y) 의 형태로 사용하며, 결과는 1, 0, -1 3 가지 중 하나로 반환됩니다. 1 은 X > Y, 0 은 X == Y, -1 은 X < Y 의 경우라고 보면 됩니다. 이 메소드는 두 Date 객체를 밀리세컨드 기준으로 크기를 비교합니다. currentDate.compareTo(endDate) <= 0 의 의미는 currentDate <= endDate 의 의미라고 보면 됩니다. 즉, currentDate 가 끝 날짜를 넘지 않는 동안 반복하라는 이야기입니다. 


18 라인

SimpleDateFormat 객체의 format 메소드를 통해서 currentDate Date 객체를 String 객체로 변환하여 ArrayList 에 추가합니다.


19 ~ 22 라인

현재 날짜와 시간을 가지는 Calendar 객체를 만들어서 Calendar 객체의 setTime 메소드를 통해 currentDate 를 설정합니다. 그리고 add 메소드를 통해서 원하는 필드에 원하는 수를 더할 수 있는데, add(Calendar.DAY_OF_MONTH, 1) 문장을 통해서 일자 (Calendar.DAY_OF_MONTH) 에 1 을 더합니다. 그리고 getTime 메소드를 통해서 Calendar 객체에 설정된 시간 및 날짜를 Date 형태로 가져와서 currentDate 가 이를 가리키게 합니다.


24 ~ 26 라인

시작 날짜와 끝 날짜를 포함한 그 사이의 모든 날짜 문자열들이 저장되어 있는 dates ArrayList 의 모든 요소들을 전체 출력합니다.


[실행 결과]



(SimpleDateFormat 클래스 참고)

https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html


(Date 클래스 참고)

https://docs.oracle.com/javase/8/docs/api/java/util/Date.html

by kkikkodev 2017. 3. 29. 23:29