2つの日付の間のすべての日付を取得するにはどうすればいいですか?

2つの日付の間のすべての日付を取得する方法?

1. 概要

Java 8で導入された新しいTime APIにより、外部ライブラリを使用せずに日付と時刻を処理できました。

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

2. Java 7を使用する

Java 7では、それを計算する1つの方法は、Calendarインスタンスを使用し、ループを実行し、addメソッドと終了日に達するCalendar.Dateフィールドユニットを使用して各反復で1日を追加することです。

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

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

    Calendar endCalendar = new GregorianCalendar();
    endCalendar.setTime(endDate);

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

3. Java 8の使い方

Java 8では、日付の連続した無限Streamを作成し、関連する部分のみを取得できるようになりました。 残念ながら、there is no way of terminating an infinite Stream when a predicate gets matched –これが、これら2日間の日数を計算してから、単にlimit()Stream:を計算する必要がある理由です。

public static List 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. Java 9を使用する

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

public static List 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.を呼び出すだけで実行できます。

そして、いつものように、コードスニペットはover on GitHubで見つけることができます。