Отформатируйте LocalDateTime в XMLGregorianCalender со смещением - PullRequest
0 голосов
/ 04 марта 2020

У меня есть экземпляр LocalDateTime.

Мне нужно отобразить его XMLGregorianCalendar (используя здесь JAXB), и в конце XML, я хотел бы, чтобы время выглядело следующим образом в XML документе: 2020-03-04T19: 45: 00.000 + 1:00 (1 час - это смещение от UT C).

Я попытался преобразовать LocalDateTime в строку с помощью DateTimeFormatter, а затем сопоставить его с XMLGregorianCalender. .

У меня сейчас два вопроса:

  1. Мне не удалось найти форматировщик в DateTimeFormatter, который форматирует время со смещением в UT C? Существует ли что-то подобное или мне нужно определить мой шаблон форматирования?

    Во-вторых, если я могу отформатировать LocalDateTime в нужном мне формате String, достаточно ли этого, если я просто создаю XMLGregorianCalendar из строкового представления?

1 Ответ

1 голос
/ 05 марта 2020

Если смещение часового пояса должно быть получено из часового пояса 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
...