🧑🏻‍💻

Java Stream APIで2つの差分のLocalDateな日付Listを作るTips

2025/02/04に公開

💡結論として

結論これです。

Stream APIで2つの日数の差分の日付リストを取得できるコード

LocalDate startDate = LocalDate.of(2023, 02, 14);

long numOfDays = ChronoUnit.DAYS.between(LocalDate.of(2023, 02, 14), LocalDate.of(2023, 02, 18));

List<LocalDate> daysRange = Stream
   .iterate(startDate, date -> date.plusDays(1))
   .limit(numOfDays)
   .collect(Collectors.toList());

Stream.iterate(startDate, date -> date.plusDays(1))

でdateに対してプラス1日し続けます。

.limit(numOfDays)

で制限を書けると。

今回の場合は2つの日付を与えられるとそこから差分を出したいのでこんな感じです。

public List<LocalDate> createBetweenDates(final LocalDate startDate, final LocalDate endDate) {
    if (Objects.isNull(startDate) || Objects.isNull(endDate)) {
        return null;
    }

    long diffDate = ChronoUnit.DAYS.between(startDate, endDate) + 1;

    return Stream
            .iterate(startDate, date -> date.plusDays(1))
            .limit(diffDate).collect(Collectors.toList());
}

ポイント

  • ChronoUnitでbetweenを求めるときはどちらかがnullだと落ちるのでnullチェックが必要です
  • 日付の差分がないと1個もリストを作成してくれないので1日だけ差分が出るようにする
    • 2022-01-012022-01-02にして**[2022-01-01]**が返るようにしている

他の手段があるとすれば

for文で書くとこんな

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate) {
    List<Date> dates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();
    calendar.setTime(startdate);

    while (calendar.getTime().before(enddate))
    {
        Date result = calendar.getTime();
        dates.add(result);
        calendar.add(Calendar.DATE, 1);
    }
    return dates;
}

While文で書くとこんな

List<Date> dates = new ArrayList<Date>();

String str_date ="27/08/2010";
String end_date ="02/09/2010";

DateFormat formatter ; 

formatter = new SimpleDateFormat("dd/MM/yyyy");
Date  startDate = (Date)formatter.parse(str_date); 
Date  endDate = (Date)formatter.parse(end_date);
long interval = 24*1000 * 60 * 60; // 1 hour in millis
long endTime =endDate.getTime() ; // create your endtime here, possibly using Calendar or Date
long curTime = startDate.getTime();
while (curTime <= endTime) {
    dates.add(new Date(curTime));
    curTime += interval;
}
for(int i=0;i<dates.size();i++){
    Date lDate =(Date)dates.get(i);
    String ds = formatter.format(lDate);    
    System.out.println(" Date is ..." + ds);
}

まとめ

意外と簡単そうでぱっと出てこなかったので書いてみました。やはりStream APIすっきりしていいですね!

書籍

おすすめJava書籍。Javaをやってる人でも一度でも目を通すとだいぶ理解が深まります。

引用など

https://www.web-dev-qa-db-ja.com/ja/java/javaの2つの日付の間の日付のリストを取得する方法/969894923/

https://m-shige1979.hatenablog.com/entry/2017/03/10/080000

https://qiita.com/tsuka611/items/3049c033c67eb93aa09f#streamの途中に挟むパターン

いかがでしたか?この記事が良いと思ったらシェアお願いします!著者がすごく喜びます。

Discussion