1. 概要

このクイックチュートリアルでは、Java 7、Java 8、およびJava 9で、開始日と終了日を使用して、日付の範囲を反復処理するいくつかの方法を学習します。

2. Java 7

Java 7以降、クラスjava .util.Dateを使用して日付値を保持し、java.util.Calendarを使用してある日付から次の日付にインクリメントします。

単純なwhileループとjava.util.Dateおよびjava.util.Calendarクラスを使用した例を見てみましょう。

void iterateBetweenDatesJava7(Date start, Date end) {
    Date current = start;

    while (current.before(end)) {
        processDate(current);

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(current);
        calendar.add(Calendar.DATE, 1);
        current = calendar.getTime();
    }
}

3. Java 8

Java 8以降、新しいJava 8 DateAPIを使用できます。 これにより、自己処理型で不変で流暢でスレッドセーフなオブジェクトが得られます。 また、を使用すると、日付をインクリメントするためのjava.util.Calendarのようなヘルパークラスを必要とせずにクリーンなコードを記述できます。

単純なforループ、 LocalDate クラス、およびメソッド plusDays(1)を使用して、日付の範囲を進めてみましょう。

void iterateBetweenDatesJava8(LocalDate start, LocalDate end) {
    for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {
        processDate(date);
    }
}

ここで注目に値するのは、 StreamAPIはJava8から利用可能ですが、DateAPIをStreamAPIと組み合わせて使用して2つの日付を繰り返すことは、Java9まで不可能です。

Java 8 Date APIの詳細については、この記事をご覧ください。

4. Java9以降

Java 9では、datesUntilメソッドが導入されています。このメソッドを使用すると、StreamAPIを使用して開始日から終了日まで反復できます。

この機能を利用するために、サンプルコードを更新しましょう。

void iterateBetweenDatesJava9(LocalDate start, LocalDate end) {
    start.datesUntil(end).forEach(this::processDate);
}

5. 結論

この簡単な記事で見たように、Javaでは、ある範囲の日付を反復処理するのは簡単な作業です。 これは、DateAPIを使用して日付をより簡単に処理できるJava8以降を使用する場合に特に当てはまります。

Java 7以前では、日付のみを使用している場合でも、日付と時刻の両方を処理することをお勧めします。

ただし、Java 8以降では、必要に応じて、 LocalDate、 LocalDateTime、などのオプションのような適切なクラスをDateAPIから選択できるという利点があります。

そしてもちろん、Java 9以降では、StreamAPIをDateAPIと組み合わせて使用して、日付のストリームを繰り返すことができます。

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