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のにあります。