我正在使用xmlText()方法获取XmlObject的Xml表示形式。 XmlDateTime对象在字符串的末尾带有时区偏移量,根据XML Schema: dateTime有效。有什么方法可以强制XmlObject以Zulu格式转换为xml?

得到这个:2002-10-10T12:00:00-05:00
而是需要这个:2002-10-10T17:00:00Z

最佳答案

我之所以问XmlDateTime对象的实例化,是因为前一段时间我遇到了类似的问题。据我所知,将XmlDateTime打印到xml的方式取决于内部表示的值,而内部表示又取决于调用提供该值的setter。问题出在setDate(...)方法上。

XmlDateTime的默认实现在内部将datetime的值保留为org.apache.xmlbeans.GDate,这是使用GDateBuilder构建的。当您在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(...)方法,因此可以像下面那样测试normalize方法:
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上打印它的唯一方法。

我希望有更好的方法,尽管遗憾的是我找不到它...

10-08 03:32