ブログ
Javaで時刻の計算をするとき、DateとLocalDateTimeのどちらを使うべきか
こんにちは!Ry.Kです。
Javaでプログラムを書いていると、日付や時刻を扱う場面でどのクラスを使うべきか迷うことがあります。
特に業務システムでは、予約時間や有効期限、処理開始・終了時刻など、「時刻の計算」を正しく扱う必要がある場面が多いです。
その際にクラスの選択を誤ると、バグやコードの可読性低下の原因にもなります。
今回、時刻の計算を含む処理を実装する中で、DateとLocalDateTimeのどちらを使うべきか悩む場面があったため、改めて整理してみました。
基本的な日付・時刻クラスについて
Javaには日付や時刻を扱うためのクラスがいくつか用意されています。従来はDateやCalendarが使われてきましたが、これらはAPIが直感的でなく、扱いづらいという課題がありました。
そのため、Java 8以降ではjava.timeパッケージが追加され、より安全で分かりやすく日付・時刻を扱えるようになっています。
この記事では、従来から使われているDateと、Java 8以降で主に利用されるLocalDateTimeを取り上げ、それぞれの違いや特徴を比較してみました。
Dateについて
Dateは古くから利用されている日付・時刻クラスで、一見シンプルに見えますが、可変オブジェクトであるため意図せず値が変更されてしまうことがあり、扱う際には注意が必要です。また、日付や時刻、タイムゾーンが混ざっているため、慣れていないと操作が分かりにくく感じることもあります。
以下は、Dateを使った時刻計算の例です。
// 現在時刻(例:2026-01-01 12:00:00の場合)
Date start = new Date();
// 2時間後を計算
Date end = new Date(start.getTime() + 2 * 60 * 60 * 1000);
System.out.println(start);
System.out.println(end);
// 出力
// start : Thu Jan 01 12:00:00 GMT 2026
// end : Thu Jan 01 14:00:00 GMT 2026
このようにDateでも時刻の計算は可能ですが、ミリ秒単位で計算する必要があり、可読性があまり高くありません。
また、計算内容を見ただけでは「何時間加算しているのか」が分かりづらいという問題もあります。
それでもDateが現在まで使われ続けている理由としては、古いコードベースやライブラリとの互換性が挙げられます。既存システムの保守や外部APIとの連携では、どうしてもDateを扱わざるを得ない場面もあり、完全に避けられるわけではないのが実情です。
LocalDateTimeについて
LocalDateTimeはJava 8で追加された日付・時刻クラスで、日付と時刻を不変オブジェクトとして扱えます。
そのため、plusHoursなどで日時を操作しても元の値が書き換わることはなく、Dateでありがちな「いつの間にか時刻が変わっていた」といったトラブルを防げます。
以下は、LocalDateTimeを使った時刻計算の例です。
// 現在時刻(例:2026-01-01 12:00:00の場合)
LocalDateTime start = LocalDateTime.of(2026, 1, 1, 12, 0);
// 2時間後を計算
LocalDateTime end = start.plusHours(2);
System.out.println(start);
System.out.println(end);
// 出力
// start : 2026-01-01T12:00
// end : 2026-01-01T14:00
このように、plusHoursやminusMinutesといったメソッドを使うことで、「何をしたいのか」がコードから直感的に読み取れるのが LocalDateTimeの大きなメリットです。
また、LocalDateTimeはタイムゾーンの概念を持たず、「そのままの日時」を表現できるため、予約時刻や処理時刻など、ローカルな日時を扱う用途に向いています。
時刻の計算を行うならどちらを使うべきか?
時刻の加算や差分計算を行う場合は、LocalDateTimeを使うのが一般的です。
不変オブジェクトであるため安全に扱え、plusHoursやminusMinutesなどの直感的なメソッドにより、時刻計算もシンプルに記述できます。
一方、Dateは古いコードベースや外部ライブラリとの連携など、利用が避けられない場面に限って使われることが多いです。
まとめ
今回はJavaにおける日付・時刻クラスについて簡単に整理してみました。
特に時刻の計算を行う場合は、LocalDateTimeを使うことで安全かつ分かりやすい実装が可能になります。
数値計算で型の選択が重要なように、日付や時刻の扱いでも適切なクラスを選ぶことが大切だと感じました。
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!