Java 9에서 도입된 LocalDate.datesUntil() 메서드는 두 개의 LocalDate 인스턴스 사이에 날짜 스트림(Stream)을 생성해 주며, 필요에 따라 단계 크기(step)까지 지정할 수 있습니다. 이 메서드는 두 가지 오버로드된 형태로 제공됩니다.
datesUntil() 메서드의 두 가지 형태
- 첫 번째 형태: 종료 날짜(end date)만 인수로 받습니다. 현재 날짜부터 종료 날짜까지의 모든 날짜를 하루 단위로 포함하는 스트림을 반환합니다.
- 두 번째 형태: 종료 날짜와 함께 Period 객체를 매개변수로 받습니다. 이를 통해 특정 간격으로 날짜를 건너뛰면서 시작 날짜와 종료 날짜 사이에서 선택된 날짜들만 스트리밍할 수 있습니다.
문법
public Stream<LocalDate> datesUntil(LocalDate end)
public Stream<LocalDate> datesUntil(LocalDate end, Period step)
예제
아래 예제에서는 1980년 8월 8일부터 같은 해 12월 25일까지의 날짜를 다룹니다. 첫 번째 스트림은 하루 단위로 모든 날짜를 생성한 뒤 skip(50)과 limit(10)을 사용해 일부만 출력하고, 두 번째 스트림은 Period.ofMonths(1)를 지정하여 한 달 간격의 날짜만 추출합니다.
import java.time.LocalDate;
import java.time.Period;
import java.time.Month;
import java.util.stream.Stream;
public class DatesUntilMethodTest {
public static void main(String args[]) {
final LocalDate myBirthday = LocalDate.of(1980, Month.AUGUST, 8);
final LocalDate christmas = LocalDate.of(1980, Month.DECEMBER, 25);
System.out.println("Day-Stream:\n");
final Stream<LocalDate> daysUntil = myBirthday.datesUntil(christmas);
daysUntil.skip(50).limit(10).forEach(System.out::println);
System.out.println("\nMonth-Stream:\n");
final Stream<LocalDate> monthsUntil = myBirthday.datesUntil(christmas, Period.ofMonths(1));
monthsUntil.limit(5).forEach(System.out::println);
}
}
실행 결과
Day-Stream:
1980-09-27
1980-09-28
1980-09-29
1980-09-30
1980-10-01
1980-10-02
1980-10-03
1980-10-04
1980-10-05
1980-10-06
Month-Stream:
1980-08-08
1980-09-08
1980-10-08
1980-11-08
1980-12-08
실행 결과를 보면 Day-Stream은 생일부터 크리스마스까지의 날짜 중 51번째 날짜부터 10개가 출력되었고, Month-Stream은 한 달 간격인 매월 8일의 날짜만 순서대로 출력된 것을 확인할 수 있습니다.