LocalDateTime от Joda Time ISO 8601 форматирование без информации о часовом поясе - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над Rest API в Spring Boot, и мы используем фантастическую библиотеку Joda Time. Поскольку мой сервер настроен на работу в часовом поясе UTC, нет необходимости использовать во всем приложении DateTime, в котором есть информация DateTimeZone. Мы предпочитаем использовать LocalDateTime для хранения всех дат в системе.

Теперь вопрос о печати LocalDateTime в формате IOS 8601. Посмотрите на код ниже:

TimeZone.setDefault(TimeZone.getTimeZone("UTC")); // server timezone
DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); // yyyy-MM-dd'T'HH:mm:ss.SSSZZ
LocalDateTime createdAtLocalDateTime =  LocalDateTime.now();
DateTime createdAtDateTime =  user.getCreatedAt().toDateTime(DateTimeZone.UTC);
logger.info("DT: {}", fmt.print(createdAtDateTime));
logger.info("LDT: {}", fmt.print(createdAtLocalDateTime));

Это выводит такие результаты:

DT: 2019-03-20T20:19:19.691Z
LDT: 2019-03-20T20:37:00.642

Таким образом, в конце сериализации LocalDateTime нет Z, но при сериализации DateTime в часовом поясе UTC Z.

Теперь вопрос : Как я могу сконфигурировать средство форматирования для вывода этой информации TimeZone в конце (этой буквы Z) во время сериализации LocalDateTime экземпляров. Я знаю, что это всегда в UTC, но одна из наших библиотек-потребителей ожидает эту информацию о часовом поясе, и мы, к сожалению, не можем изменить код в ней.

Лучший вопрос : Как настроить Джексона ObjectMapper для сериализации LocalDateTime в json с этой Z информацией в конце?

Добавление в форматер fmt.withZoneUTC() не работает.

1 Ответ

1 голос
/ 20 марта 2019

Вы можете добавить текстовый литерал в ваш форматер:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .append(ISODateTimeFormat.dateTime())
        .appendLiteral('Z')
        .toFormatter();
...