java.util.Date vs java.sql.Date

java.util.Date vs java.sql.Date

**

1. 概要

このチュートリアルでは、java.util.Datejava.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秒を使用します。これは、ご覧のとおり、「うるう秒」を考慮していません。

With the introduction of Java 8, java.time package should be used。 Java 8より前は、代替ソリューション(Joda Time)が利用可能でした。

3. java.sql.Date

java.sql.Datejava.util.Dateクラスを拡張します。

その主な目的は、年、月、日を保持するSQL DATEを表すことです。 時間データは保持されません。

実際、日付は1970年1月1日00:00:00 GMT以降のミリ秒として保存され、時間部分は正規化されています。 ゼロに設定します。

基本的に、SQL固有の要件を処理するのはjava.util.Dateのラッパーです。 java.sql.Dateは、データベースを処理する場合にのみ使用する必要があります。

ただし、java.sql.Dateはタイムゾーン情報を保持していないため、ローカル環境とデータベースサーバー間のタイムゾーン変換はJDBCドライバーの実装に依存します。 これにより、別のレベルの複雑さが追加されます。

最後に、他のSQLデータ型(SQLTIMEとSQLTIMESTAMP)をサポートするために、他の2つのjava.sqlクラス(TimeTimestamp)を使用できることに注意してください。

後者は、java.util.Dateから拡張されますが、ナノ秒をサポートします。

4. 結論

クラスjava.util.Dateは、エポックからのミリ秒として日時値を格納します。 java.sql.Dateは日付のみの値を格納し、JDBCで一般的に使用されます。

日付の処理には注意が必要です。 うるう秒、異なるタイムゾーンなどの特別な場合について覚えておく必要があります。 JDBCを扱う場合、java.sql.Dateを注意して使用できます。

java.util.Date,を使用する場合は、その欠点について覚えておく必要があります。 Java 8を使用している場合は、java.util.Dateをまったく使用しない方がよいでしょう。

**