java.util.Date vs java.sql.Date
**
1. 概要
このチュートリアルでは、java.util.Dateとjava.sql.Dateの2つの日付クラスを比較します。
比較を完了すると、どちらを使用するのか、なぜ使用するのかが明確になります。
2. java.util.Date
The java.util.Date class represents a particular moment in time, with millisecond precision since the 1st of January 1970 00:00:00 GMT (the epoch time)。 このクラスは、協定世界時(UTC)を維持するために使用されます。
2つの方法で初期化できます。
コンストラクターを呼び出すことにより:
Date date = new Date();
これにより、時刻が現在の時刻に設定され、ミリ秒単位で測定された新しいdateオブジェクトが作成されます。
または、エポックからのミリ秒数を渡すことにより:
long timestamp = 1532516399000; // 25 July 2018 10:59:59 UTC
Date date = new Date(timestamp);
Java 8より前に存在していた他のコンストラクターは、現在非推奨になっていることに注意してください。
ただし、Date has a number of issues and overall its usage isn’t recommended anymore。
変更可能です。 初期化したら、その内部値を変更できます。 たとえば、setTimeメソッドを呼び出すことができます。
date.setTime(0); // 01 January 1970 00:00:00
不変オブジェクトの利点の詳細については、次の記事を確認してください:Immutable Objects in Java。
また、すべての日付をうまく処理できるわけではありません。 技術的には、協定世界時(UTC)を反映する必要があります。 ただし、それはホスト環境のオペレーティングシステムに依存します。
最新のオペレーティングシステムのほとんどは、1日= 24時間x60秒x60秒= 86400秒を使用します。これは、ご覧のとおり、「うるう秒」を考慮していません。
3. java.sql.Date
java.sql.Dateはjava.util.Dateクラスを拡張します。
その主な目的は、年、月、日を保持するSQL DATEを表すことです。 時間データは保持されません。
実際、日付は1970年1月1日00:00:00 GMT以降のミリ秒として保存され、時間部分は正規化されています。 ゼロに設定します。
基本的に、SQL固有の要件を処理するのはjava.util.Dateのラッパーです。 java.sql.Dateは、データベースを処理する場合にのみ使用する必要があります。
ただし、java.sql.Dateはタイムゾーン情報を保持していないため、ローカル環境とデータベースサーバー間のタイムゾーン変換はJDBCドライバーの実装に依存します。 これにより、別のレベルの複雑さが追加されます。
後者は、java.util.Dateから拡張されますが、ナノ秒をサポートします。
4. 結論
クラスjava.util.Dateは、エポックからのミリ秒として日時値を格納します。 java.sql.Dateは日付のみの値を格納し、JDBCで一般的に使用されます。
日付の処理には注意が必要です。 うるう秒、異なるタイムゾーンなどの特別な場合について覚えておく必要があります。 JDBCを扱う場合、java.sql.Dateを注意して使用できます。
java.util.Date,を使用する場合は、その欠点について覚えておく必要があります。 Java 8を使用している場合は、java.util.Dateをまったく使用しない方がよいでしょう。
**