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

Javaで文字列形式の2つの日付を比較する方法【初心者向け解説】

Javaでは、文字列として表現された日付同士を直接比較することはできません。まず文字列を日付オブジェクトに変換(パース)し、そのうえで比較用のメソッドを使う必要があります。

本記事では、以下の2つの方法をサンプルコード付きで解説します。

  • 従来からのSimpleDateFormatjava.util.Dateクラスを使う方法
  • Java 8以降で推奨されるLocalDateクラス(java.time API)を使う方法

方法1:SimpleDateFormatとDateクラスを使う

java.text.SimpleDateFormatクラスは、文字列を日付へ、あるいは日付を文字列へ変換するためのクラスです。

  • コンストラクタに希望する日付フォーマットを表す文字列を渡すと、SimpleDateFormatオブジェクトが生成されます。
  • 文字列をDateオブジェクトとして取得するには、このクラスをインスタンス化してparse()メソッドで日付文字列を解析します。
  • java.util.Dateクラスは特定の時点(瞬間)を表し、before()after()equals()などのメソッドで2つの日付を比較できます。

サンプルコード

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

public class Demo {
    public static void main(String args[]) throws ParseException {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateStr1 = "2007-11-25";
        String dateStr2 = "1999-09-12";

        // 文字列をDateオブジェクトにパース
        Date date1 = formatter.parse(dateStr1);
        Date date2 = formatter.parse(dateStr2);

        if (date1.after(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " より後の日付です");
        } else if (date1.before(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " より前の日付です");
        } else if (date1.equals(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " と同じ日付です");
        }
    }
}

実行結果

2007-11-25 は 1999-09-12 より後の日付です

方法2:LocalDateクラスのparse()メソッドを使う(推奨)

Java 8以降では、日時API(java.timeパッケージ)のLocalDateクラスを使うことが推奨されています。parse()メソッドは日付を表す文字列を受け取り、LocalDateオブジェクトを返します。デフォルトではISO-8601形式(yyyy-MM-dd)の文字列を解析します。

比較には以下のメソッドを使用します。

  • isAfter():呼び出し元の日付が引数より後かどうかを判定
  • isBefore():呼び出し元の日付が引数より前かどうかを判定
  • isEqual()equals():2つの日付が等しいかどうかを判定

サンプルコード

import java.time.LocalDate;

public class Test {
    public static void main(String args[]) {
        String dateStr1 = "2007-11-25";
        String dateStr2 = "1999-09-12";

        LocalDate date1 = LocalDate.parse(dateStr1);
        LocalDate date2 = LocalDate.parse(dateStr2);

        if (date1.isAfter(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " より後の日付です");
        } else if (date1.isBefore(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " より前の日付です");
        } else if (date1.isEqual(date2)) {
            System.out.println(dateStr1 + " は " + dateStr2 + " と同じ日付です");
        }
    }
}

実行結果

2007-11-25 は 1999-09-12 より後の日付です

独自フォーマットの文字列を解析する場合

「yyyy/MM/dd」などISO形式以外の文字列を扱う場合は、DateTimeFormatterを組み合わせます。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class FormatDemo {
    public static void main(String args[]) {
        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd");
        LocalDate date = LocalDate.parse("2007/11/25", fmt);
        System.out.println(date); // 2007-11-25
    }
}

注意点まとめ

  • SimpleDateFormatはスレッドセーフではありません。マルチスレッド環境で共有すると誤動作の原因になるため注意が必要です。
  • LocalDateはイミュータブル(不変)でスレッドセーフなので、安全に利用できます。
  • 新規開発では、旧来のjava.util.DateやSimpleDateFormatではなく、java.time API(LocalDate、DateTimeFormatterなど)の使用が公式にも推奨されています。
  • LocalDate.parse()はデフォルトで「yyyy-MM-dd」形式を想定するため、それ以外の形式の文字列は必ずDateTimeFormatterを指定してください。
  1. Javaで2つの画像を比較する方法:RGB差分から類似度をパーセンテージで算出

    2つの画像を比較する手順 Javaで2枚の画像を比較し、その差分をパーセンテージとして求めるには、以下の手順に従います。 ImageIO.read() メソッドを使って、比較対象となる2枚の画像を読み込みます。 それぞれの画像の幅と高さを取得し、両者のサイズが一致しているかを確認します。 各画像のピクセル値を取得し、そこからRGB(赤・緑・青)の各値を取り出します。 2枚の画像の対応するピクセル同士のRGB値の差をすべて合計します。 次の式を使って、差分の割合(パーセンテージ)を計算します。 Average = difference / (width × height × 3); Perc

  2. Javaで文字列を比較する方法|equals()とequalsIgnoreCase()の使い分けを徹底解説

    Javaで文字列の等価性を比較する際は、Stringクラスが提供するequalsメソッドまたはequalsIgnoreCaseメソッドを使用するのが基本です。この記事では、それぞれのメソッドの使い方に加えて、==演算子で文字列を比較してはいけない理由についても詳しく解説します。 equals()メソッドで文字列を比較する 2つの文字列を比較し、大文字と小文字の違いまで厳密に判定したい場合はequals()メソッドを使用します。 次のコード例では、2つのStringインスタンスが大文字小文字を含むすべての文字において一致しているかどうかを判定しています。 public class Compare