XMLGregorianCalendarをjava.sql.タイムスタンプ
-
13-12-2019 - |
質問
私は携webサービスを挿入し、記録に戻すことでタイムスタンプの値をXMLGregorianCalendarタイプです。いに変換するには、java.sql.タイムスタンプの値を使用していますので機能。
public static java.sql.Timestamp getSqlTimeStamp(XMLGregorianCalendar xgc) {
if (xgc == null) {
return null;
} else {
return new Timestamp(xgc.toGregorianCalendar().getTime().getTime());
}
}
Timestamp timestamp=getSqlTimeStamp(ExitInXMLGregor.getTimestamp());
私の問題は、サーバのタイムスタンプの値を挿入し、以下のようなものです:2012-10-03T19:23:22.342+02:00
しかし自分のタイプ変換を入手したいのタイムスタンプ値のようになります:2012-10-03T17:23:22.342
当サーバーのwebserviceり)2h以上が私のlocale、何らかの理由でリタイアを取得私のロケールの挿入時に、変換します。問題は、がんを取得する必要があるサーバー時、原因のDBのtimestamp値に合わせたサーバーで、私が有する問題の更新操作により、異なる価値観の時刻です。
ください、と思う。よろしく!
編集:私のような解決策を見なしてしまう。私変換私のタイムスタンプをjava.sql.タイムスタンプのフォーマットでXMLGregorianし設定のタイムゾーンのサーバー(setTimeZone(TimeZone.getTimeZone("GMT+02:00"))).実はこのころから遠く離れた場所ですが、理想的なソリューションなりますので注意してください(なタイムゾーンも、サーバの変更)では非常にユニークで、これまで知らこのタイムゾーンのサーバー dinamicallyがわからないどう---
public static XMLGregorianCalendar getXMLGregorianCalendar(Timestamp timestamp)
throws BaseException {
try {
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeZone(TimeZone.getTimeZone("GMT+02:00"));
gc.setTimeInMillis(timestamp.getTime());
return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
} catch (DatatypeConfigurationException ex) {
throw new BaseException(ex);
}
}
解決
iタイムスタンプが正しい時間を指定したと疑われる、正しいタイムゾーンでは表示されません。 2012-10-03T17:23:22.342は、前者の(非表示)タイムゾーンが+00:00であると仮定して、2012-10-03t19:23:22.342 + 02:00と同じです。
他のヒント
tl;dr
- 両方の文字列に表示されるものと同じ瞬間だけで、調整時間帯に失敗しながら注意する オフセットから世界標準時間.
- このような混乱によりどちらのオフセットゾーン情報などの文字列です。
- 代 java.時間 クラsupplantの面倒なレガシィ。(
Instant
, ない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.
)
取得データベースから、JDBC4.2以降である。
Instant instant = myResultSet.getObject( … , Instant.class ) ;
java.時間
としての 正しい受け答えによるロバート-ペ-Schneck とってはその両方の文字列に表示されるものと同じ瞬間にも調整を異なる時間帯が異なるオフセットからのUTCです。問題はこの二つの文字列が表す指標のオフセットからのUTCです。
な抜けの悪い方の練習に行うことができ、いくつものこの混乱した。を必ず明記してくださいオフセットからのUTCないと絶対にあるこのオフセット/帯は明らかでない。
仕事の世界標準時間で
作UTCを避けるこのような現場は混乱していた。一般的にコメント、店舗、交換の日程-時間の値がUTCです。調整からのUTC時間帯にのみ、ユーザへの表示又は必要な場合によるビジネスロジック
また、ご利用のものすごく煩わしい古いクラスはsupplantedの java.時間 ます。換された XMLGregorianCalendar
へ java.time.ZonedDateTime
.
ZonedDateTime zdt = myXMLGregorianCalendar.toGregorianCalendar().toZonedDateTime() ;
調整UTCを抽出し、 Instant
オブジェクトです。
Instant instant = zdt.toInstant() ;
としてのJDBC4.2以降で直接交換 java.時間 オブジェクトのデータベースです。なっ軒のレガシー java.sql.Timestamp
クラスです。
myPreparedStatement.setObject( … , instant ) ;
検索:
Instant instant = myResultSet.getObject( … , Instant.class ) ;
調整からのUTCには、ある特定の時間帯を見たいときは同時利用の壁時計の時刻で使用する人の特定。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;
変換
していますが、異常ではなくタの一部の古いコードが必要 java.sql.Timestamp
, トげと java.time.Instant
.新しい変換の方法に加え、古います。
java.sql.Timestamp ts = java.sql.Timestamp.from( instant ) ;
ものです。
Instant instant = ts.toInstant() ;
参照 私の答え 同様の質問です。
報 java.時間
の java.時間 枠組みがJava8以降である。これらのクラスsupplantの面倒古 レガシー 日付-時間の授業など java.util.Date
, Calendar
, & SimpleDateFormat
.
の Joda-時間 プロジェクトは、 メンテナンスモード,助言への移行 java.時間 ます。
詳細は、 Oracleのチュートリアル.検索スタックオーバーフローのための多くの例で説明しています。仕様 JSR310.
お取引所 java.時間 オブジェクトを直接データベース.を使用 JDBCドライバ 対応 JDBC4.2 以降となります。が必要ない文字列が必要ない java.sql.*
ます。
入手先のjava.時間の授業で
- Java SE8, Java SE9, Java SE10, 以降、
- ですのでお問い合わせ下さい。
- 一部の標準のJava APIでは、同梱の実装です。
- Java9を追加し若干の特徴と問題を修正
- Java SE6 や Java SE7
- 多くのjava.時間の機能はバに移植されるJava6&7 ThreeTen-Backport.
- Android
- 次期バージョン以降でも、Androidのバンドルの実装 java.時間 ます。
- それ以前のAndroid(<26)、 ThreeTenABP プロジェクトに対応 ThreeTen-Backport (上).見 使い方ThreeTenABP....
の ThreeTenインストール プロジェクトextends java.時間を追加します。このプロジェクトには、立地のためには、将来的な追加java.ます。すべての授業などはこちら Interval
, YearWeek
, YearQuarter
, は、 以上.