java.util.Date vs java.sql.Date

1概要

このチュートリアルでは、2つの日付クラスを比較します。

java.util.Date および java.sql.Date

比較が完了したら、どちらを使用するか、またその理由は明らかです。

2 java.util.Date

  • java.util.Date クラスは、1月1日からのミリ秒の精度で、特定の瞬間を表します。 1970 00:00:00グリニッジ標準時(エポックタイム)** 。このクラスは協定世界時(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 にはいくつかの問題があり、全体的な使用法は推奨できません

それは変わりやすいです。初期化したら、その内部値を変更できます。

たとえば、 setTime メソッドを呼び出すことができます。

date.setTime(0);//01 January 1970 00:00:00

不変オブジェクトの利点についてもっと学ぶために、この記事をチェックしてください。

また、すべての日付をうまく処理することはできません。技術的には、協定世界時(UTC)を反映する必要があります。ただし、それはホスト環境のオペレーティングシステムによって異なります。

最近のほとんどのオペレーティングシステムでは、1日24時間x 60m x 60秒= 86400秒を使用していますが、このことからわかるように、「うるう秒」は考慮されていません。

  • Java 8の導入により、https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html[ java.time ]パッケージを使用する必要があります** 。 Java 8より前のバージョンでは、代わりの解決策がありました - Joda Time

3. java.sql.Date

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

実際、日付は、1970年1月1日00:00:00 GMTからのミリ秒として格納され、時間部分は正規化され、すなわちゼロに設定される。

基本的には、SQL固有の要件を処理する java.util.Date のラッパーです。 java.sql.Date は、データベースを扱う場合にのみ使用してください。

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

最後に、他のSQLデータ型、SQL TIMEとSQL TIMESTAMPをサポートするために、他に2つの java.sql クラスが利用可能であることに注意してください。

Time およびhttps://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html[ Timestamp ]。

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

4結論

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

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

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

  • **