使用偏移量将 LocalDateTime 格式化为 XMLGregorianCalender

Format LocalDateTime to XMLGregorianCalender with offset

我有一个 LocalDateTime 实例。

我需要映射它 XMLGregorianCalendar(在这里使用 JAXB),最后 XML,我希望时间看起来像 XML 文档中的以下内容: 2020-03-04T19:45:00.000 + 1:00(1 小时是与 UTC 的偏移量)。

我尝试使用 DateTimeFormatter 将 LocalDateTime 转换为字符串,然后将其映射到 XMLGregorianCalender。

我现在有两个问题:

  1. 我没能在 DateTimeFormatter 中找到任何格式化程序 哪种格式的时间与 UTC 的偏移量?做这样的事情 存在还是我需要定义我的格式化程序模式?

    其次,如果我能够将 LocalDateTime 格式化为字符串格式,我 需要,如果我只创建一个 XMLGregorianCalendar 从 字符串表示?

如果要从 JVM 的默认时区导出时区偏移量,则编码如下:

LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.systemDefault()); // <== default
OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime();
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
        .newXMLGregorianCalendar(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

System.out.println(localDateTime);        // 2020-03-04T15:58:09.604171800
System.out.println(zonedDateTime);        // 2020-03-04T15:58:09.604171800-05:00[America/New_York]
System.out.println(offsetDateTime);       // 2020-03-04T15:58:09.604171800-05:00
System.out.println(xmlGregorianCalendar); // 2020-03-04T15:58:09.604171800-05:00

如果你想硬编码+01:00的偏移量,那么这样做:

LocalDateTime localDateTime = LocalDateTime.now();
OffsetDateTime offsetDateTime = localDateTime.atOffset(ZoneOffset.ofHours(1)); // <== hardcoded
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
        .newXMLGregorianCalendar(offsetDateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

System.out.println(localDateTime);        // 2020-03-04T16:00:04.437550500
System.out.println(offsetDateTime);       // 2020-03-04T16:00:04.437550500+01:00
System.out.println(xmlGregorianCalendar); // 2020-03-04T16:00:04.437550500+01:00

或者像这样:

LocalDateTime localDateTime = LocalDateTime.now();
XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance()
        .newXMLGregorianCalendar(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
xmlGregorianCalendar.setTimezone(60); // <== hardcoded

System.out.println(localDateTime);        // 2020-03-04T16:03:09.032191
System.out.println(xmlGregorianCalendar); // 2020-03-04T16:03:09.032191+01:00