1. ホーム
  2. java

[解決済み] java.util.Dateをjava.sql.Dateに変換する方法は?

2022-03-20 12:10:28

質問

を使おうとしています。 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.time を追加クラスで拡張します。このプロジェクトは、将来java.timeに追加される可能性のあるもののための実験場です。ここには、次のような便利なクラスがあります。 Interval , YearWeek , YearQuarter および もっと .