tl; dr
java.util.Dateをjava.sql.Dateに変換する方法
しないでください。どちらのクラスも時代遅れです。
- レガシー&JDBC 4.2以降ではなくjava.timeクラスを使用します。
java.util.Date
java.sql.Date
- java.timeにまだ更新されていないコードと相互運用している場合は、java.timeとの間で変換します。
を使用しPreparedStatement
たクエリの例
myPreparedStatement.setObject(
… , // Specify the ordinal number of which argument in SQL statement.
myJavaUtilDate.toInstant() // Convert from legacy class `java.util.Date` (a moment in UTC) to a modern `java.time.Instant` (a moment in UTC).
.atZone( ZoneId.of( "Africa/Tunis" ) ) // Adjust from UTC to a particular time zone, to determine a date. Instantiating a `ZonedDateTime`.
.toLocalDate() // Extract a date-only `java.time.LocalDate` object from the date-time `ZonedDateTime` object.
)
交換:
Instant
の代わりに java.util.Date
両方のにUTCの瞬間を表します。しかし今ではミリ秒ではなくナノ秒になっています。
LocalDate
java.sql.Date
Bothの代わりに、時刻とタイムゾーンのない日付のみの値を表します。
細部
日付のみの値(時刻なし、タイムゾーンなし)を操作する場合は、LocalDate
ではなくクラスを使用してくださいjava.util.Date
。
java.time
Java 8以降では、Javaの初期バージョンにバンドルされていた厄介な古い日時クラスは、新しいjava.timeパッケージに取って代わられました。Oracleチュートリアルを参照してください。機能の多くは、ThreeTen-BackportでJava 6および7にバックポートされ、さらにThreeTenABPで Androidに適合されています。
SQLのデータ型は、 DATE
時間がない日の時間がないゾーンで、日付のみであることを意味します。Javaではjava.time.LocalDate
、Java 8 まで正確にそのようなクラスはありませんでした。特定のタイムゾーンに従って今日の日付を取得して、そのような値を作成しましょう(タイムゾーンは、モントリオールよりもパリの早い日の夜の日付を決定するために重要です。例)。
LocalDate todayLocalDate = LocalDate.now( ZoneId.of( "America/Montreal" ) ); // Use proper "continent/region" time zone names; never use 3-4 letter codes like "EST" or "IST".
この時点で、私たちは終わっているかもしれません。JDBCドライバーがJDBC 4.2仕様に準拠している場合、SQLのDATEフィールドに格納するためにLocalDate
via を渡すことができるはずです。setObject
PreparedStatement
myPreparedStatement.setObject( 1 , localDate );
同様に、ResultSet::getObject
SQL DATE列からJava LocalDate
オブジェクトにフェッチするために使用します。2番目の引数でクラスを指定すると、コードがタイプセーフになります。
LocalDate localDate = ResultSet.getObject( 1 , LocalDate.class );
つまり、この質問全体はJDBC 4.2以降では無関係です。
JDBCドライバーがこの方法で実行しない場合は、java.sqlタイプへの変換にフォールバックする必要があります。
java.sql.Dateに変換する
変換するには、古い日時クラスに追加された新しいメソッドを使用します。を呼び出してjava.sql.Date.valueOf(…)
を変換できますLocalDate
。
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
そして、他の方向に行く。
LocalDate localDate = sqlDate.toLocalDate();
からの変換 java.util.Date
古い日時クラスの使用は避けなければなりませんが、既存のコードを使用する場合は強制される可能性があります。その場合は、java.timeとの間で変換できます。
通過Instant
UTCでタイムライン上の瞬間を表すクラス、。はのInstant
アイデアと似ていjava.util.Date
ます。しかし、ノートInstant
への解像度まで持っナノ秒をしながら、java.util.Date
唯一持っていますミリ秒の解像度を。
変換するには、古いクラスに追加された新しいメソッドを使用します。たとえば、java.util.Date.from( Instant )
およびjava.util.Date::toInstant
。
Instant instant = myUtilDate.toInstant();
日付を決定するには、タイムゾーンのコンテキストが必要です。特定の瞬間において、日付はタイムゾーンによって世界中で異なります。ZoneId
を取得するにはを適用しますZonedDateTime
。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
LocalDate localDate = zdt.toLocalDate();
†java.sql.Dateクラスは、時刻なしの日付のみのふりをしますが、実際には時刻を真夜中に調整します。混乱していますか?はい、古い日時クラスは混乱しています。
java.timeについて
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスをjava.util.Date
、Calendar
、& SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。