1. 概要

Java8で導入された新しいTimeAPIにより、外部ライブラリを使用せずに日付と時刻を処理できるようになりました。

この短いチュートリアルでは、2つの日付の間のすべての日付を異なるバージョンのJavaで時間の経過とともに取得することがどのように簡単になるかを見ていきます。

2. Java7の使用

Java 7では、これを計算する1つの方法は、Calendarインスタンスを使用することです。

まず、開始日と終了日を時間なしで取得します。 次に、これらをループし、addメソッドとCalendar.Dateフィールドを使用して、終了日になるまで各反復で1日を追加します。

これを示すコードは次のとおりです– Calendarインスタンスを使用します。

public static List getDatesBetweenUsingJava7(Date startDate, Date endDate) {
  List datesInRange = new ArrayList<>();
  Calendar calendar = getCalendarWithoutTime(startDate);
  Calendar endCalendar = getCalendarWithoutTime(endDate);

  while (calendar.before(endCalendar)) {
    Date result = calendar.getTime();
    datesInRange.add(result);
    calendar.add(Calendar.DATE, 1);
  }

  return datesInRange;
}

private static Calendar getCalendarWithoutTime(Date date) {
  Calendar calendar = new GregorianCalendar();
  calendar.setTime(date);
  calendar.set(Calendar.HOUR, 0);
  calendar.set(Calendar.HOUR_OF_DAY, 0);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  calendar.set(Calendar.MILLISECOND, 0);
  return calendar;
}

3. Java8の使用

Java 8では、日付の連続した無限の Stream を作成し、関連する部分のみを取得できるようになりました。 残念ながら、述語が一致したときに無限ストリームを終了する方法はありません。そのため、これら2日間の日数を計算してから、単に limit()する必要があります。 ストリーム:

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

まず、ChronoUnit列挙のDAYS定数に関連付けられた、between関数を使用して2つの日付の日数の差を取得する方法に注目してください。

次に、開始日からの日数を表す整数のStreamを作成します。 次のステップでは、 plusDays() APIを使用して、整数をLocalDateオブジェクトに変換します。

最後に、すべてをリストインスタンスに収集します。

4. Java9の使用

最後に、Java 9は、これを計算するための専用のメソッドを提供します。

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

LocalDateクラスの専用datesUntilメソッドを使用して、1回のメソッド呼び出しで2つの日付の間の日付を取得できます。 datesUntill は、メソッドが呼び出された日付オブジェクトからメソッド引数として指定された日付までの日付の順番に並べられたStreamを返します。

5. 結論

この簡単な記事では、異なるバージョンのJavaを使用して2つの日付の間のすべての日付を取得する方法について説明しました。

Java8リリースで導入されたTimeAPIによって、日付リテラルに対する操作を簡単に実行できるようになりました。Java9では、datesUntil。を呼び出すだけで実行できます。

そして、いつものように、コードスニペットはGitHubにあります。