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