-1

我有一个这种形式的 XMLGregorianCalendar:2019-06-24T18:18:55.007+02:00

我怎样才能在这样的字符串中获得正确的日期(考虑到偏移量):24/06/2019 16:18

4

2 回答 2

1

您标记了您的问题 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 转换

如果您是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类。

链接

于 2019-06-25T07:41:25.833 回答
0

我发现的工作解决方案:

 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;}
于 2020-03-23T18:04:49.563 回答