Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで日付を比較する3つの方法!LocalDate・Date・Calendarクラスの使い方を徹底解説


Javaで「2つの日付のどちらが新しいか」「同じ日付かどうか」を判定したい場面はよくあります。Javaには日付を比較する方法が複数用意されており、代表的なのが LocalDateDateCalendar の3つのクラスです。この記事では、それぞれのクラスを使った日付比較のやり方を、サンプルコードと実行結果つきでわかりやすく解説します。

1. LocalDateクラスを使う方法(Java 8以降)

java.time.LocalDate クラスは、タイムゾーン情報を持たない「ローカル日付」を表すクラスです。従来の Date クラスの代わりに使うことができ、日付だけを扱いたい場合に最適です。2つの日付を比較するための isBefore()isAfter()isEqual() といった便利なメソッドが提供されています。

サンプルコード

import java.time.LocalDate;

public class Sample {
    public static void main(String args[]) {
        LocalDate date1 = LocalDate.of(2007, 11, 25);
        LocalDate date2 = LocalDate.of(1999, 9, 12);

        Boolean bool1 = date1.isAfter(date2);
        Boolean bool2 = date1.isBefore(date2);
        Boolean bool3 = date1.isEqual(date2);

        if (bool1) {
            System.out.println(date1 + " is after " + date2);
        } else if (bool2) {
            System.out.println(date1 + " is before " + date2);
        } else if (bool3) {
            System.out.println(date1 + " is equal to " + date2);
        }
    }
}

実行結果

2007-11-25 is after 1999-09-12

2. Dateクラスを使う方法

java.util.Date クラスは、特定の時点(瞬間)を表す伝統的なクラスです。before()after()equals() の各メソッドを使って2つの日付を比較できます。文字列から Date オブジェクトを作る場合は、SimpleDateFormat でパースするのが一般的です。

サンプルコード

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sample {
    public static void main(String args[]) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

        // 文字列をDateオブジェクトへ変換(パース)
        Date date1 = formatter.parse("2007-11-25");
        Date date2 = formatter.parse("1999-09-12");

        Boolean bool1 = date1.after(date2);
        Boolean bool2 = date1.before(date2);
        Boolean bool3 = date1.equals(date2);

        if (bool1) {
            System.out.println(date1 + " is after " + date2);
        } else if (bool2) {
            System.out.println(date1 + " is before " + date2);
        } else if (bool3) {
            System.out.println(date1 + " is equal to " + date2);
        }
    }
}

実行結果

Sun Nov 25 00:00:00 JST 2007 is after Sun Sep 12 00:00:00 JST 1999

※出力される日付の書式は、実行環境のタイムゾーンやロケールによって異なります。

3. Calendarクラスを使う方法

java.util.Calendar クラスも Date クラスと同じく、before()after()equals() メソッドによる日付比較に対応しています。getInstance() でインスタンスを取得し、set() メソッドで年月日を設定して使います。

注意点として、Calendar の月の指定は 0始まり(1月 = 0、12月 = 11)になっています。たとえば「2007年11月25日」を設定する場合は set(2007, 10, 25) と記述します。

サンプルコード

import java.util.Calendar;

public class Sample {
    public static void main(String args[]) {
        Calendar cal1 = Calendar.getInstance();
        cal1.clear();
        cal1.set(2007, 10, 25); // 2007年11月25日(月は0始まり)

        Calendar cal2 = Calendar.getInstance();
        cal2.clear();
        cal2.set(1999, 8, 15); // 1999年9月15日

        if (cal1.after(cal2)) {
            System.out.println(cal1.getTime() + " is after " + cal2.getTime());
        } else if (cal1.before(cal2)) {
            System.out.println(cal1.getTime() + " is before " + cal2.getTime());
        } else if (cal1.equals(cal2)) {
            System.out.println(cal1.getTime() + " is equal to " + cal2.getTime());
        }
    }
}

実行結果

Sun Nov 25 00:00:00 JST 2007 is after Wed Sep 15 00:00:00 JST 1999

※Calendar オブジェクトをそのまま出力すると内部情報が大量に表示されるため、getTime() で Date に変換して表示すると読みやすくなります。

まとめ:どのクラスを使うべき?

  • LocalDate:Java 8以降なら第一候補。日付のみを扱い、APIも直感的でタイムゾーンの影響を受けません。
  • Date:古くからあるクラスで、時刻を含む「瞬間」を表します。レガシーコードの保守などで登場します。
  • Calendar:Dateより柔軟な日付操作が可能ですが、月が0始まりなど落とし穴が多いのが難点です。

新規にコードを書く場合は、java.time パッケージ(Date-Time API)の利用が推奨されています。日付と時刻の両方を扱うなら LocalDateTime、タイムゾーンを考慮したいなら ZonedDateTime なども併せて覚えておくと便利です。

  1. JavaFXで描画できる2D形状の種類と作成方法を徹底解説

    JavaFXで利用できる主な2D形状JavaFXでは、javafx.scene.shapeパッケージに含まれるクラスを使うことで、さまざまな2D形状(ジオメトリックシェイプ)を簡単に描画できます。ここでは、代表的な形状とそれぞれの特徴を詳しく紹介します。Line(直線) − 2点を結ぶ幾何学的構造です。javafx.scene.shape.LineクラスがXY平面上の直線を表します。Rectangle(長方形) − 4辺からなる多角形で、2組の平行で等しい辺を持ち、すべての内角が直角である図形です。javafx.scene.shape.RectangleクラスがXY平面上の長方形を表します。C

  2. JavaFXのパス要素とは?種類と使い方をわかりやすく解説

    javafx.scene.shape パッケージには、2D図形を描画するためのさまざまなクラスが用意されています。しかし、これらは直線、円、多角形、楕円といった基本的な(プリミティブな)図形に限られます。より複雑なカスタム図形を描きたい場合は、Pathクラスを使用する必要があります。 Pathクラスとは Pathクラスは、図形の幾何学的な輪郭を表すクラスです。このクラスを使うことで、独自のカスタムパスを自由に描画できます。 カスタムパスを描くために、JavaFXでは複数の「パス要素」が提供されており、これらはすべて javafx.scene.shape パッケージ内のクラスとして利用可能です。