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() で比較できます。用途に応じて適切な方法を選びましょう。
-
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
-
JavaFXのパス要素とは?種類と使い方をわかりやすく解説
javafx.scene.shape パッケージには、2D図形を描画するためのさまざまなクラスが用意されています。しかし、これらは直線、円、多角形、楕円といった基本的な(プリミティブな)図形に限られます。より複雑なカスタム図形を描きたい場合は、Pathクラスを使用する必要があります。 Pathクラスとは Pathクラスは、図形の幾何学的な輪郭を表すクラスです。このクラスを使うことで、独自のカスタムパスを自由に描画できます。 カスタムパスを描くために、JavaFXでは複数の「パス要素」が提供されており、これらはすべて javafx.scene.shape パッケージ内のクラスとして利用可能です。