このように、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にキャストできません
何か案は..?ありがとう!
私は答えを見つけました:
Timestamp timestamp = new Timestamp(var2.getXMLGregorianCalendar().toGregorianCalendar().getTimeInMillis());
var1.setTimeStamp(timestamp);
従来の日時クラスは避けてください。ただし、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クラスに取って代わられました。
javax.xml.datatype.XMLGregorianCalendar
は Java.time.ZonedDateTime
に置き換えられます。Java.util.GregorianCalendar
は Java.time.ZonedDateTime
に置き換えられます。古いクラスに追加された新しい変換メソッドに注意してください。Java.sql.Timestamp
はJava.time.Instant
に置き換えられ、どちらもUTCでナノ秒の解像度の瞬間を表します。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 8以降に組み込まれています。これらのクラスは厄介な古い legacyJava.util.Date
、 Calendar
、& 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に将来追加される可能性のある試験場です。ここには、 Interval
、 YearWeek
、 YearQuarter
、 more )などの便利なクラスがあります。