[解決済み] java.util.Dateをjava.sql.Dateに変換する方法は?
質問
を使おうとしています。
java.util.Date
を入力とし、それを使ってクエリを作成したいのですが、そのためには
java.sql.Date
.
暗黙的または明示的に変換を行うことができないことに驚きました - しかし、Java APIがまだかなり新しいので、私はこれをどのように行うかさえわかりません。
どのように解決するのですか?
tl;dr
<ブロッククオートjava.util.Dateをjava.sql.Dateに変換する方法は?
やめてください。
両方
Date
クラスは時代遅れです。
日
,
オラクル
を、そして
日本通信
コミュニティは、数年前にこれらのレガシーな日付時間クラスをあきらめ、全会一致で
JSR 310
を定義しています。
java.time(ジャバタイム
クラスがあります。
-
使用方法
java.time
クラスの代わりに、レガシー
java.util.Date
&です。java.sql.Date
JDBC 4.2以降を使用した場合。 - java.timeに更新されていないコードと相互運用する場合は、java.timeとの間で変換する。
java.util.Date
java.time.Instant
java.util.Date.toInstant()
java.util.Date.from( Instant )
java.sql.Date
java.time.Date
java.sql.Date.toLocalDate()
java.sql.Date.valueOf( LocalDate )
を使ったクエリの例
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
どちらも時刻やタイムゾーンを伴わない日付のみの値を表します。
詳細
日付だけの値(時間帯なし、タイムゾーンなし)を扱おうとする場合は、次のようにします。
LocalDate
クラスではなく
java.util.Date
.
Java.time(ジャバタイム
Java 8以降では、初期のバージョンのJavaにバンドルされていた厄介な古い日付-時刻クラスは、新しい java.time パッケージ . 参照 オラクルチュートリアル . 機能の多くは、Java 6 & 7 にバックポートされています。 スリーテン・バックポート でAndroidに対応させ、さらに スリーテンABP .
A
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仕様
を渡すことができるはずです。
LocalDate
を介して
setObject
で
PreparedStatement
をSQLのDATEフィールドに格納します。
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に変換する
変換するには、古い date-time クラスに追加された新しいメソッドを使用します。以下のように呼び出すことができます。
java.sql.Date.valueOf(…)
を変換するために
LocalDate
.
java.sql.Date sqlDate = java.sql.Date.valueOf( todayLocalDate );
そして反対方向へ。
LocalDate localDate = sqlDate.toLocalDate();
から変換する
java.util.Date
古い date-time クラスの使用は避けるべきですが、既存のコードで作業する場合はそうせざるを得ないかもしれません。その場合は、java.time.DateClassとの間で変換することができます。
を経由して
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クラスは、時刻を指定しない日付のみのクラスと見せかけて、実は が行います。 は、午前0時の時刻に調整された時刻です。紛らわしいですか?そう、古い日付-時刻クラスは混乱しているのです。
について java.time(ジャバタイム
は
java.time
フレームワークは、Java 8以降に組み込まれています。これらのクラスは、面倒な古い
レガシー
のような日付時間クラスがあります。
java.util.Date
,
Calendar
, &
SimpleDateFormat
.
さらに詳しく知りたい方は オラクルチュートリアル . また、Stack Overflowで検索すると、多くの例や解説が見つかります。仕様書は JSR 310 .
は ジョダタイム プロジェクトは、現在 メンテナンスモード への移行を推奨しています。 Java.time クラスがあります。
を交換することができます。
java.time
オブジェクトを直接データベースとやり取りすることができます。データベースと直接接続するには
JDBCドライバ
に準拠した
JDBC 4.2
またはそれ以降であること。文字列は必要ありません。
java.sql.*
クラスがあります。Hibernate 5 & JPA 2.2サポート
java.time
.
java.timeクラスはどこで手に入りますか?
-
Java SE 8
,
Java SE 9
,
Java SE 10
,
Java SE 11
以降 - 標準のJava APIの一部で、バンドルされている実装があります。
- ジャバ9 は、いくつかのマイナーな機能と修正をもたらしました。
-
Java SE 6
と
Java SE 7
- ほとんどの java.time(ジャバタイム の機能は、Java 6 & 7 にバックポートされています。 スリーテンバックポート .
-
アンドロイド
- Androidの後期バージョン(26以上)では、このバンドルに java.time クラスがあります。
-
以前のAndroid(<26)では、以下のような処理が行われていました。
APIデスガリング
をもたらす。
のサブセットです。
java.time
の機能は、もともとAndroidに組み込まれていないものです。
- デスガリングで必要なものが提供されない場合は スリーテンABP プロジェクトが適応する スリーテン-バックポート (前述)をAndroidに対応させました。参照 ThreeTenABPの使用方法... .
は
スリーテン・エキストラ
プロジェクトは、java.time を追加クラスで拡張します。このプロジェクトは、将来java.timeに追加される可能性のあるもののための実験場です。ここには、次のような便利なクラスがあります。
Interval
,
YearWeek
,
YearQuarter
および
もっと
.
関連
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み] JavaScriptで現在の日付を取得するには?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] java.util.Dateとjava.sql.Dateの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
jd-gui Java Exceptionが発生しました。
-
javaの模造品QQ WeChatのチャットルーム
-
プロジェクトの依存関係を解決できなかった 解決
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
サーブレットクラスのインスタンス化エラーの解決法
-
Methodのinvokeメソッド実装のJavaリフレクション
-
Spring BootのテストメソッドFailed to load ApplicationContextの問題を解決する
-
HttpClientがGZIP形式でない場合の対処法
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決