正如@Thomas的回答所说,一种替代方案是使用xxx
(或XXX
),如在javadoc中解释的那样。它们之间唯一的区别是当偏移量为零时:XXX
格式化为Z
,而xxx
格式化为+00:00
:
Pattern Count Equivalent builder methods
------- ----- --------------------------
XXX 3 appendOffset("+HH:MM","Z")
xxx 3 appendOffset("+HH:MM","+00:00")
无论如何,只需选择其中一个(我已经使用ZonedDateTime
和ZoneOffset.UTC
进行了测试,两者都可以):
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-ddXXX");
String str = formatter.format(zonedDateTime);
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(str);
如果您拥有一个ZonedDateTime
,将其转换为一个GregorianCalendar
更容易,然后将其传递给您的DatatypeFactory
:
ZonedDateTime zonedDateTime = ZonedDateTime.now();
GregorianCalendar cal = GregorianCalendar.from(zonedDateTime);
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
一个棘手的细节是,当使用上述
String
模式(仅包含日期)时,结果将把时间字段(小时、分钟、秒和毫秒)设置为零,而转换为
GregorianCalendar
将使用在
ZonedDateTime
中设置的时间。
但是,在将其转换为
GregorianCalendar
之前,您可以将时间设置为午夜。
// convert to calendar (set the time to 00:00:00.000)
GregorianCalendar cal = GregorianCalendar.from(zonedDateTime.with(LocalTime.MIDNIGHT));
通过这样做,结果将与使用String
相同。
yyyy-MM-ddZZZZ
吗?JavaDoc 中写道:“一个、两个或三个字母输出小时和分钟,不带冒号,例如 '+0130',... 多个字母输出本地化偏移的完整形式”。 - Thomas