如何在 Java 7 中将 ZonedDateTime 转换为 XMLGregorianCalendar

How to convert ZonedDateTime to XMLGregorianCalendar in Java 7

我的 java 7 应用程序正在使用 Java 8 中的服务,我收到一个日期字符串,如

"2020-04-13T12:36:13Z" 

这实际上是一个 ZonedDateTime。 我需要将此字符串转换为 XMLGregorianCalendar 并发送到另一个服务吗? 由于我的应用程序在 java 7 中,我无法将字符串解析为 ZonedDateTime 。有什么办法可以进行这种转换吗?

知道怎么做就很容易。

    String receivedDateTimeString = "2020-04-13T12:36:13Z";
    
    XMLGregorianCalendar xmlgc = DatatypeFactory.newInstance()
            .newXMLGregorianCalendar(receivedDateTimeString);
    
    System.out.println(xmlgc);

输出:

2020-04-13T12:36:13Z

ZonedDateTime.toString() 有时会生成 ISO 8601 格式(有时会生成扩展格式,其区域 ID 不属于 ISO 8601)。在你的情况下,你有纯 ISO 8601。XML 文档中的日期和时间使用 ISO 8601 的变体,它足够接近,我们可以将它们视为相同的目的。因此,直接从 ISO 8601 字符串创建一个 XMLGregorianCalendar 实例,其 toString 方法返回相同的 ISO 8601 字符串。

ThreeTen Backport 允许您在 Java 7

中使用 ZonedDateTime

你可以,而且你可能更喜欢在 Java 7 中使用 ZonedDateTime 而不是 XMLGregorianCalendar。这个使用经过 ThreeTen Backport,java.time 到 Java 6 和 7 的 backport,见底部的链接。

import org.threeten.bp.ZonedDateTime;

public class DemoZonedDateTimeInJava7 {

    public static void main(String[] args) {
        String receivedDateTimeString = "2020-04-13T12:36:13Z";
        ZonedDateTime zdt = ZonedDateTime.parse(receivedDateTimeString);
        System.out.println(zdt);
    }

}

2020-04-13T12:36:13Z

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接