使用偏移量将 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。
我现在有两个问题:
我没能在 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
我有一个 LocalDateTime 实例。
我需要映射它 XMLGregorianCalendar(在这里使用 JAXB),最后 XML,我希望时间看起来像 XML 文档中的以下内容: 2020-03-04T19:45:00.000 + 1:00(1 小时是与 UTC 的偏移量)。
我尝试使用 DateTimeFormatter 将 LocalDateTime 转换为字符串,然后将其映射到 XMLGregorianCalender。
我现在有两个问题:
我没能在 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