如何从XmlGregorianCalendar获得考虑了偏移的日期?

时间:2019-06-24 19:16:22

标签: date java-6 xmlgregoriancalendar

我具有以下格式的XMLGregorianCalendar: 2019-06-24T18:18:55.007 + 02:00

我如何像这样在String中获取正确的日期(考虑了偏移量): 24/06/2019 16:18

2 个答案:

答案 0 :(得分:1)

您标记了问题java-6。但是我正在使用现代Java日期和时间API java.time提出现代答案。可通过ThreeTen Backport在Java 6中使用(请参见底部的链接)。

根据获取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();

现在剩下的如上。优点:很短,我认为其中没有任何惊喜。缺点:对我来说,格式化回原始字符串并再次解析就感觉像是绕路了。

另一种选择遍历了过时的GregorianCalendar类:

    GregorianCalendar gc = xmlgc.toGregorianCalendar();
    ZonedDateTime zdt = DateTimeUtils.toZonedDateTime(gc);
    String formattedUtcDateTime = zdt.toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC)
            .format(displayFormatter);

专业人士:我认为这是官方转换。缺点:比以前长了一行,而且正如我所说,它使用了设计欠佳且过时的GregorianCalendar类。

链接

答案 1 :(得分:0)

我找到的有效解决方案:

<div class="limiter">
  <div class="InnerBox">
    <div>
      <h2>CLICK HERE</h2>
      <p>Lorem, ipsum.</p>
    </div>
  </div>

  <div class="OuterBox"></div>
</div>