あなたは混乱しているかもしれません:
- 日付と時刻を UTCで
java.util.Date
表すクラス
- 時刻とタイム ゾーンの
java.sql.Date
ない、日付のみを表すクラス。
00:00:00.0
実際には、java.sql.Date は java.util.Date を拡張するため、実際には時刻を継承しますが、時刻を UTCに設定することで、時刻を持たないふりをします。クラスのドキュメントでは、継承関係を無視するように指示されています (これはハックです)。混乱しますか?はい、これらの古い日時クラスはごちゃごちゃしていて、設計が不十分で、混乱を招き、面倒です。
これらの古いクラスは、Java 8 以降に組み込まれたjava.timeクラスに取って代わられました。機能の多くは、ThreeTen-Backport で Java 6 および 7 にバックポートされ、さらに ThreeTenABP で Android に適合されています。
データベース列が SQL 標準型 TIMESTAMP WITH TIME ZONE と同様の型である場合は、次のいずれかを使用できます。
Instant
ナノ秒までの解像度を持つ UTC のタイムライン上の瞬間。
Instant instant = Instant.now();
ZonedDateTime
のようInstant
ですが、特定のタイムゾーンに調整されています。
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) );
JDBC ドライバーが JDBC 4.2 仕様に準拠している場合setObject
は、PreparedStatement
.
ドライバーが java.time 型の直接使用をサポートしていない場合は、java.sql 型の使用にフォールバックします。java.time 型との間で変換するために古いクラスに追加された新しいメソッドを見つけます。java.sql.Timestamp
に/から変換できる、特に日時値のクラスを探していますInstant
。この変換のために、 a からZonedDateTime
an を抽出できます。Instant
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );
別の方向に進みます。
Instant instant = mySqlTimestamp.toInstant();