您标记了您的问题 java-6。然而,我正在使用现代 Java 日期和时间 API java.time 呈现现代答案。这在 Java 6 中通过 ThreeTen Backport 可用(请参阅底部的链接)。
根据您从哪里获得XMLGregorianCalendar,您可能不需要拥有一个。如果我理解正确的话,这个类用于表示 XML 文档中的日期和时间,它们的格式类似于 2019-06-24T18:18:55.007+02:00。这种格式足够接近 ISO 8601,java.time 的类可以直接解析它,我们更喜欢这样:
Locale userLocale = Locale.forLanguageTag("mt-MT"); // Maltese Malta
DateTimeFormatter displayFormatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(userLocale);
String fromXml = "2019-06-24T18:18:55.007+02:00";
OffsetDateTime dateTime = OffsetDateTime.parse(fromXml);
String formattedUtcDateTime = dateTime.withOffsetSameInstant(ZoneOffset.UTC)
.format(displayFormatter);
System.out.println(formattedUtcDateTime);
此 sn-p 的输出是(在 Java 1.7.0_67 中使用 ThreeTen Backport 版本 1.3.6 测试):
24/06/2019 16:18
假设格式是为了向用户显示,我建议使用 Java 的本地化格式。我选择了马耳他语言环境,因为它完全符合您要求的格式。如果您的用户使用不同的语言环境,您仍应考虑该语言环境的格式。
从 XMLGregorianCalendar 转换
如果您的 XMLGregorianCalendar 来自您现在无法更改的旧版 API,则有多种转换方法。
一种是从XMLGregorianCalendar取回字符串:
XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
.newXMLGregorianCalendar("2019-06-24T18:18:55.007+02:00");
String fromXml = xmlgc.toString();
现在剩下的和上面一样。 Pro:它很短,我认为它没有任何惊喜。缺点:对我来说,格式化回原始字符串并再次解析它感觉像是绕道而行。
另一种选择是通过过时的GregorianCalendar 类:
GregorianCalendar gc = xmlgc.toGregorianCalendar();
ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(gc);
String formattedUtcDateTime = zdt.toOffsetDateTime()
.withOffsetSameInstant(ZoneOffset.UTC)
.format(displayFormatter);
Pro:我认为这是官方转换。缺点:它长了一行,正如我所说,它使用了设计不佳且早已过时的GregorianCalendar 类。
链接