web-dev-qa-db-ja.com

XMLGregorianCalendarをJava.sql.Timestampに変換します

このように、XMLGregorianCalendarの日付をJava.sql.Timestamp変数に割り当てようとしています...

var1.setTimeStamp(Timestamp.valueOf(var2.getXMLGregorianCalendar().toString()))

しかし、どうやら、これは機能しておらず、例外をスローします...

Java.lang.IllegalArgumentException:タイムスタンプ形式はyyyy-mm-dd hh:mm:ss [.fffffffff]である必要があります

そして、私もこれを試しました:

var1.setTimeStamp((Timestamp) var2.getXMLGregorianCalendar().getTime())

だが...

Java.lang.ClassCastException:Java.util.DateをJava.sql.Timestampにキャストできません

何か案は..?ありがとう!

14
elcadro

私は答えを見つけました:

    Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
    var1.setTimeStamp(timestamp);
20
elcadro

tl; dr

従来の日時クラスは避けてください。ただし、javax.xml.datatype.XMLGregorianCalendarを渡された場合は、最新のJava.time.Instantクラスに変換してください。 Java.sql.Timestampを使用する必要はありません。

myPreparedStatement.setObject( 
    … , 
    myXMLGregorianCalendar  // If forced to work with a `javax.xml.datatype.XMLGregorianCalendar` object rather than a modern Java.time class…
    .toGregorianCalendar()  // …convert to a `Java.util.GregorianCalendar`, and then…
    .toZonedDateTime()      // …convert to modern `Java.time.ZonedDateTime` class.
    .toInstant()            // Adjust to UTC by extracting an `Instant` object.
)

[〜#〜] jdbc [〜#〜]4.2 以降)の時点でのデータベースからの取得。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

Java.time

参考までに、ひどく厄介な古い日時クラスは、Java.timeクラスに取って代わられました。

XMLGregorianCalendarの使用は避けてください。ただし、Java.timeタイプ用にまだ更新されていない古いコードとインターフェースする必要がある場合は、変換してください。中間ステップとして、質問のコードに示されているようにGregorianCalendarに変換します。

Java.util.GregorianCalendar gc = myXMLGregorianCalendar.toGregorianCalendar() ;

ここで、古いGregorianCalendarクラスに追加された新しい便利な変換メソッドを使用して、最新のJava.time.ZonedDateTimeオブジェクトを取得します。

ZonedDateTime zdt = gc.toZonedDateTime() ;  // Convert from legacy class to modern class.

その特定のタイムゾーンから [〜#〜] utc [〜#〜] に調整します。定義上、常にUTCでの瞬間である Instant オブジェクトを抽出します。

Instant instant = zdt.toInstant() ;  // Adjust from some time zone to UTC.

JDBC 4.2以降、Java.timeオブジェクトをデータベースと直接交換できます。したがって、もう一度Java.sql.Timestampに触れる必要はありません。

myPreparedStatement.setObject( … , instant ) ;

検索:

Instant instant = myResultSet.getObject( … , Instant.class ) ;

Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは厄介な古い legacyJava.util.DateCalendar 、& SimpleDateFormat などの日時クラス。

Joda-Time プロジェクトは現在 メンテナンスモード であり、 Java.time クラスへの移行をアドバイスします。

詳細については、 Oracle Tutorial を参照してください。多くの例と説明については、Stack Overflowを検索してください。仕様は JSR 310 です。

Java.timeオブジェクトをデータベースと直接交換できます。 JDBCドライバーJDBC 4.2 以降に準拠)を使用します。文字列やJava.sql.*クラスは必要ありません。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある試験場です。ここには、 IntervalYearWeekYearQuartermore )などの便利なクラスがあります。

1
Basil Bourque