時間を失う
1つの問題は、java.sql.Dateが…</p>であると想定されていることです。
インスタンスが関連付けられている特定のタイムゾーンで時間、分、秒、およびミリ秒をゼロに設定することにより、「正規化」されます。
…ドキュメントによると。これは、日時の時間部分がjava.util.DateまたはJoda-TimeDateTimeオブジェクトからクリアされていることを意味します。
タイムゾーンなし
Gilbert Le Blancによる正解として、java.util.Dateとjava.sql.Dateの両方に内部的にタイムゾーンの概念がありません。Unixエポックからのミリ秒数を格納します。
これらのクラスは厄介なトリックを引き出します。それらのtoString
メソッドは、JVMのデフォルトのタイムゾーンを文字列のレンダリングに適用します。とても紛らわしい。オブジェクトにはDate
タイムゾーンがありませんが、文字列として表示するとタイムゾーンが表示されます。
java.util.Dateオブジェクトにエポック(1970開始)からの1344902399000Lミリ秒の数が含まれている場合、それは2012-08-13T23:59:59.000Z
UTC/GMTを意味します。ただし、JVMが夏時間(DST)が有効になっているフランスにあると信じている場合は、UTC/GMTより2時間進んでいることがわかります。2012-08-14T01:59:59.000+02:00
これはそのクラスのひどい文字列形式で記述されています。同じ時刻は、異なるタイムゾーンで異なる曜日の意味(13対14)を持ち、壁の時計は真夜中を過ぎています。
ジョーダ-救助の時間
ここでは、 Joda- Time2.4ライブラリが役立ちます。java.sql.Dateまたはjava.util.DateオブジェクトをUTCタイムゾーンオブジェクトとともにDateTimeコンストラクターに渡して、苦労している値を明確に把握します。
java.util.Date date = new java.util.Date( 1390276603054L );
DateTime dateTimeUtc = new DateTime( date, DateTimeZone.UTC );
System.out.println( "dateTimeUtc: " + dateTimeUtc );
実行時…</p>
2014-01-21T03:56:43.054Z
反対方向をJoda-Timeからjava.util.Dateに変換するには…</p>
java.util.Date date = myDateTime.toDate();
反対方向をJoda-Timeからjava.sql.Dateに変換するには…</p>
java.sql.Date date = new java.sql.Date( myDateTime.getMillis() );
更新– java.time
Joda-Timeプロジェクトは現在メンテナンスモードにあり、チームはjava.timeクラスへの移行をアドバイスしています。
に相当するものはjava.util.Date
ですInstant
。このクラスは、 UTCInstant
のタイムライン上の瞬間をナノ秒の解像度(小数の最大9桁)で表します。
Instant instant = Instant.ofEpochMilli( 1390276603054L );
タイムゾーンを適用して、aとJoda-Timeに類似したZoneId
を生成します。ZonedDateTime
java.util.Calendar
DateTime
ZoneId z = ZoneId.of( "Europe/Kaliningrad" );
ZonedDateTime zdt = instant.atZone( z );
次に、日付のみの値、その日付部分をZonedDateTime
として抽出しますLocalDate
。このLocalDate
クラスは、時刻やタイムゾーンのない日付のみの値を表します。ふりをしLocalDate
ているjava.sql.Date
のは、日付のみの値です。
LocalDate localDate = zdt.toLocalDate() ;
PreparedStatement::setObject
JDBC 4.2以降では、およびを介して、準拠するドライバーでjava.time型を直接使用できますResultSet::getObject
。
myPreparedStatement.setObject( … , localDate );
…そして…</p>
LocalDate ld = myResultSet.getObject( … , LocalDate.class );
古い非準拠ドライバーの場合は、古いクラスに追加された新しいメソッドを使用して、aとの間でjava.sql.Date
オブジェクトに簡単に変換します。LocalDate
toLocalDate
valueOf( LocalDate )