首页 > 解决方案 > 如何在 Java 7 中将 ZonedDateTime 转换为 XMLGregorianCalendar

问题描述

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

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

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

标签: java-8java-7

解决方案


当你知道怎么做时很容易。

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

ThreeTen Backport 允许您在 Java 7 中使用 ZonedDateTime

您可以,而且您可能更喜欢ZonedDateTime在 Java 7 中使用,而不是XMLGregorianCalendar. 此使用通过 ThreeTen Backport,java.time 到 Java 6 和 7 的反向移植,请参阅底部的链接。

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,现代类的后向端口(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接


推荐阅读