xmlText()メソッドを使用してXmlObjectのXml表現を取得しています。XmlDateTimeオブジェクトは、XMLスキーマ:dateTimeに従って有効な文字列の最後にタイムゾーンオフセットを付けて出力されます。XmlObjectをZuluフォーマットでxmlに変換するように強制する方法はありますか?
これを取得する:2002-10-10T12:00:00-05:00代わりにこれが必要:2002-10-10T17:00:00Z
xmlText()メソッドを使用してXmlObjectのXml表現を取得しています。XmlDateTimeオブジェクトは、XMLスキーマ:dateTimeに従って有効な文字列の最後にタイムゾーンオフセットを付けて出力されます。XmlObjectをZuluフォーマットでxmlに変換するように強制する方法はありますか?
これを取得する:2002-10-10T12:00:00-05:00代わりにこれが必要:2002-10-10T17:00:00Z
少し前に同様の問題に遭遇したため、XmlDateTime オブジェクトのインスタンス化について質問していました。私が理解できることから、XmlDateTime が xml に出力される方法は、内部表現の値に依存し、内部表現は、その値を提供するために呼び出されたセッターに依存していました。問題は setDate(...) メソッドにありました。
XmlDateTime のデフォルト実装は、日時の値を GDateBuilder を使用して構築された org.apache.xmlbeans.GDate として内部的に保持します。XmlDateTime オブジェクトに日付を設定すると、最終的にその値が GDateBuilder に渡されます。setDate() メソッドのソースを見ると、javadoc には次のように記載されています。
Sets the current time and date based on a java.util.Date instance.
The timezone offset used is based on the default TimeZone. (The default TimeZone is consulted to incorporate daylight savings offsets if applicable for the current date as well as the base timezone offset.)
If you wish to normalize the timezone, e.g., to UTC, follow this with a call to normalizeToTimeZone.
XmlDateTime オブジェクトには setGDate(...) メソッドがあるため、次のように正規化メソッドをテストできます。
XmlDateTime xmlDateTime = XmlDateTime.Factory.newInstance();
xmlDateTime.setStringValue("2002-10-10T12:00:00-05:00");
System.out.println(xmlDateTime.xmlText());
GDateBuilder gdb = new GDateBuilder(xmlDateTime.getDateValue());
gdb.normalize();
xmlDateTime.setGDateValue(gdb.toGDate());
System.out.println(xmlDateTime.xmlText());
私にとって、これは次のように印刷されました:
<xml-fragment>2002-10-10T12:00:00-05:00</xml-fragment>
<xml-fragment>2002-10-10T17:00:00Z</xml-fragment>
それが UTC で印刷できる唯一の方法でした。
悲しいことに、私はそれを見つけることができませんでしたが、より良い方法があることを願っています...