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

Javaで時刻を比較する方法まとめ|LocalTimeとDateクラスの使い分け

はじめに

Javaで時刻(時間値)を扱う場面は多く、たとえば「指定した時刻が営業時間内かどうか」「2つのログの時刻の前後関係」などを判定したいことがあります。Javaでは主にjava.time.LocalTimeクラスを使う方法と、従来からあるjava.util.Dateクラス+SimpleDateFormatを使う方法があります。この記事では、それぞれの方法で2つの時刻を比較するサンプルコードを紹介します。

方法1:LocalTimeクラスで比較する

Java 8以降で導入されたLocalTimeクラスは、タイムゾーン情報を持たない「ローカルの時刻」を表します。このクラスには、2つの時刻を比較するための便利なメソッドが用意されています。

  • isAfter() … 対象の時刻が引数より後(遅い)場合に true を返す
  • isBefore() … 対象の時刻が引数より前(早い)場合に true を返す
  • isEqual() … 両者の時刻が等しい場合に true を返す

コード例

import java.time.LocalTime;
public class Test {
    public static void main(String args[]) {
        LocalTime Time1 = LocalTime.of(10, 15, 45);
        LocalTime Time2 = LocalTime.of(07, 25, 55);

        Boolean bool1 = Time1.isAfter(Time2);
        Boolean bool2 = Time1.isBefore(Time2);

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

実行結果

10:15:45 is after 07:25:55

この例では、10時15分45秒の方が7時25分55秒よりも後の時刻であるため、isAfter() が true を返しています。タイムゾーンを考慮せず純粋に時刻だけを比べたい場合は、この方法が最もシンプルで推奨されます。

方法2:DateクラスとSimpleDateFormatで比較する

文字列として与えられた日時データ(例:「8:27:45 AM」)を比較したい場合は、SimpleDateFormatクラスで文字列をパースしてDateオブジェクトに変換し、その後比較メソッドを使います。Dateクラスには以下のメソッドがあります。

  • after() … 対象の日時が引数より後の場合に true を返す
  • before() … 対象の日時が引数より前の場合に true を返す
  • equals() … 両者の日時が等しい場合に true を返す

コード例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CreateDateTime {
    public static void main(String args[]) throws ParseException {
        String timeStr1 = "8:27:45 AM";
        String timeStr2 = "2:30:12 PM";

        // SimpleDateFormatクラスのインスタンスを生成
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss a");

        Date dateTime1 = formatter.parse(timeStr1);
        Date dateTime2 = formatter.parse(timeStr2);

        Boolean bool1 = dateTime1.after(dateTime2);
        Boolean bool2 = dateTime1.before(dateTime2);
        Boolean bool3 = dateTime1.equals(dateTime2);

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

実行結果

8:27:45 AM is after 2:30:12 PM

午前8時27分45秒は、24時間表記では「08:27:45」、午後2時30分12秒は「14:30:12」となるため、前者の方が後の時刻です。したがって after() が true を返し、「8:27:45 AM is after 2:30:12 PM」と出力されます。

どちらの方法を選ぶべきか

  • 新しいプロジェクトならLocalTimeがおすすめ:java.time API(JSR-310)はスレッドセーフで直感的なAPI設計になっており、現在のJava開発では標準的な選択肢です。
  • レガシーなコードや既存ライブラリとの連携ではDateも有効:古いシステムではDateクラスが使われていることも多いため、読み書きできるようにしておくと安心です。
  • 文字列から時刻を生成する場合はフォーマットに注意:SimpleDateFormatのパターン(HH:mm:ss など)が実際の文字列と一致していないと、ParseException や誤った解析結果につながります。

まとめ

Javaで時刻を比較するには、LocalTimeクラスの isBefore() / isAfter() / isEqual() メソッドを使うのが現代的で安全な方法です。一方、文字列形式の時刻データを扱う場合は SimpleDateFormat でパースして Date オブジェクトに変換し、after() / before() / equals() で比較できます。用途に応じて適切な方法を選びましょう。

  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 パッケージ内のクラスとして利用可能です。