[자바] 두 날짜 사이의 날짜 얻기

ebc0320·2021년 9월 13일
2

Java

목록 보기
1/1

사용자에게서 날짜를 입력받을 때, 해당하는 모든 날짜를 입력받을 수도 있겠지만 사용자의 편의를 위해서 시작일과 종료일만을 입력받을 경우가 많습니다.
입력받은 값을 시작일, 종료일이란 컬럼 값으로 넣어 하나의 값으로 넣을 때는 큰 문제가 없겠지만 그 날짜를 이용해 사이의 모든 날짜에 값을 넣어줘야 할 때 코드가 복잡해질 수 있는데요.

예를 들면 2021년 12월 31일부터 2022년 1월 2일을 입력받았다면 월도 1월로 바뀌어야 될 뿐만 아니라 연도도 2022년으로 자동으로 올라가야 하기 때문입니다.
이러한 모든 계산을 if나 case 문을 이용하여 코드를 짜면 그 길이도 길어지고 가독성에도 문제가 생길 수 있죠.

Java8부터는 시작일부터(from) 종료일까지(to)의 날짜만을 입력받았을 때 사이에 종료하는 모든 날짜를 구하는데 사용할 수 있는 너무나도 간편하고 효과적인 코드가 있습니다.

public class DatesBetweenTwoDates {

	public static void main(String[] args) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/d");

		LocalDate startDate = LocalDate.parse("2021/09/31", formatter);
		LocalDate endDate = LocalDate.parse("2021/10/05", formatter);

		System.out.println(getDatesBetweenTwoDates(startDate, endDate));
	}

	public static List<LocalDate> getDatesBetweenTwoDates(LocalDate startDate, LocalDate endDate) {
		int numOfDaysBetween = ChronoUnit.DAYS.between(startDate, endDate);
		return IntStream.iterate(0, i -> i + 1)
        	.limit(numOfDaysBetween)
        	.mapToObj(i -> startDate.plusDays(i))
		.collect(Collectors.toList());
	}
}

결과값: [2021-09-30, 2021-10-01, 2021-10-02, 2021-10-03, 2021-10-04]

총 필요한 값은 3개 입니다.
시작일, 종료일, 그리고 두 날짜 간의 일자 수인데요.
9월 1일부터 9월 3일까지라면 9월 1일, 9월 2일 두 날짜가 있으므로 daysBetweenDates는 2가 됩니다.
무한으로 생성되는 IntStream에 이 daysBetweenDates 값 2를 넣어 생성할 날짜의 한도를 정해준 뒤 해당 Int 값을 plusDays를 통해 LocalDate로 변환해줍니다.
그리고 그 값들을 리스트에 넣어주면서 끝인 정말 간단한 코드입니다.

그런데 Java9에서는 이보다도 더 간단하고 짧은 코드로 두 날짜 사이에 존재하는 모든 날짜들을 얻을 수 있습니다.

public class DatesBetweenTwoDates {

	public static void main(String[] args) {
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/d");

		LocalDate startDate = LocalDate.parse("2021/09/31", formatter);
		LocalDate endDate = LocalDate.parse("2021/10/05", formatter);

		System.out.println(getDatesBetweenTwoDates(startDate, endDate));
	}

	public static List<LocalDate> getDatesBetweenTwoDates(LocalDate startDate, LocalDate endDate) {
		return startDate.datesUntil(endDate)
        	.collect(Collectors.toList());
	}
}

결과값: [2021-09-30, 2021-10-01, 2021-10-02, 2021-10-03, 2021-10-04]

보시는 것처럼 Java9부터는 아예 datesUntil이라는 LocalDate 클래스의 메소드를 이용해 간단히 시작일부터 종료일까지의 날짜를 구해줄 수 있습니다.

자바의 LocalDate 클래스를 적절히 사용하여 사용자가 입력한 from/to 날짜 사이에 존재하는 날짜를 쉽게 얻어보시길 바랍니다.

profile
배우고 정리하는 신입 개발자

0개의 댓글