我有一个这种形式的 XMLGregorianCalendar:2019-06-24T18:18:55.007+02:00
我怎样才能在这样的字符串中获得正确的日期(考虑到偏移量):24/06/2019 16:18?
我有一个这种形式的 XMLGregorianCalendar:2019-06-24T18:18:55.007+02:00
我怎样才能在这样的字符串中获得正确的日期(考虑到偏移量):24/06/2019 16:18?
您标记了您的问题 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);
此代码段的输出是(在 Java 1.7.0_67 中使用 ThreeTen Backport 版本 1.3.6 测试):
24/06/2019 16:18
假设格式是为了向用户显示,我建议使用 Java 的本地化格式。我选择了马耳他语言环境,因为它完全符合您要求的格式。如果您的用户在不同的语言环境中,您仍应考虑该语言环境的格式。
如果您是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
类。
java.time
第一次描述的地方。java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。我发现的工作解决方案:
private String getFormattedDate(final XMLGregorianCalendar xmlGregorianCalendar) {
Date time = xmlGregorianCalendar.toGregorianCalendar().getTime();
Date rightDate = DateUtils.addMinutes(time, - xmlGregorianCalendar.getTimezone());
String formatedDate = DateHelper.format(DateHelper.YYYYMMDDHHMMSS_DASH_COLONS, rightDate);
return formatedDate;}