Я спрашивал об экземпляре объекта XmlDateTime, потому что недавно столкнулся с подобной проблемой. Из того, что я мог выяснить, способ печати XmlDateTime в xml зависит от значения внутреннего представления, которое, в свою очередь, зависело от установщика, который был вызван для предоставления этого значения. Проблема была с методом 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 (...), вы можете протестировать метод нормализации следующим образом:
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.
Я надеюсь, что есть лучший способ, хотя, к сожалению, я не смог его найти ...