Javaで日付を扱う際、java.util.Date と java.sql.Date の違いに戸惑った経験はありませんか?
特にデータベース連携時は混同しやすく、意図せぬ動作の原因にもなりがちです。
この記事では、
-
java.util.Dateとjava.sql.Dateの違い -
変換方法
-
日付の差分(差)を求める実践コード
-
2025年時点の最新ベストプラクティス (
java.timeAPI)
まで、まとめて解説します。
📌 java.util.Dateとは?
| 項目 | 内容 |
|---|---|
| パッケージ | java.util |
| 用途 | Java全般の日付・時刻を扱うクラス |
| 時刻情報 | あり(ミリ秒精度) |
| 特徴 | 旧API(非推奨寄り)として扱われることが多い |
java.util.Date は、1970-01-01 00:00:00 UTC からのミリ秒を内部保持します。
ただし、日付操作は不便で、現在は LocalDate 等を使うのが推奨です。
📌 java.sql.Dateとは?
| 項目 | 内容 |
|---|---|
| パッケージ | java.sql |
| 用途 | JDBC(DB連携)で日付(年月日)を扱うためのクラス |
| 時刻情報 | なし(00:00:00固定) |
| 特徴 | DBのDATE型と対応 |
RDBのDATE型(年月日)の表現に特化しており、時刻は持ちません。
そのため、java.util.Date と相互変換すると時刻が切り捨てられる点に注意。
🔄 相互変換方法まとめ
java.util.Date → java.sql.Date
java.sql.Date → java.util.Date
⚠️ getTime() で内部のミリ秒値を共有する仕組みです。
📅 日付差分(日数差)を求めるサンプル(旧API)
TimeUnit.MILLISECONDS.toDays()でミリ秒→日に変換できます。
🎯 最新ベストプラクティス(java.time API)
Java 8以降は**LocalDateとChronoUnit.DAYS.betweenが推奨**です。
📝 まとめ
| 項目 | java.util.Date | java.sql.Date | 推奨(最新) |
|---|---|---|---|
| 主な用途 | Java全般 | DB連携 | アプリ開発全般 |
| 時刻 | あり | なし | クラスに応じて選択 |
| 推奨? | ❌ (旧API) | DB用途のみ | ✅ java.time API |
🚀 結論
-
業務アプリ → DB入出力に
java.sql.Date -
アプリ内の処理 →
java.time(LocalDate,LocalDateTime) -
日付差分は
ChronoUnit.DAYS.betweenが最もシンプル
