Как преобразовать дату json со смещением часового пояса в UTC при сопоставлении с объектом запроса контроллера

Я работаю над приложением Spring Boot, и у меня есть дата в запросе JSON со смещением часового пояса (1968-07-21T23:00:00.000+02:00), и она сопоставляется с объектом LocalDateTime, который является частью объекта-оболочки без любая проблема. Но я хочу, чтобы дата динамически настраивалась на UTC, пока она сопоставляется с этим объектом запроса в контроллере. Поэтому после того, как я получу объект-оболочку запроса в контроллере, значение этой даты должно быть «1968-07-22T01:00:00.000+00:00» с автоматической настройкой даты и часов.

Я пробовал несколько вещей для этого, но ничего не получилось, некоторые из вещей, которые я пробовал до сих пор, приведены ниже:

Подход 1: поскольку я использую Jackson 2, я аннотировал поле даты DTO, как показано ниже.

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")

Подход 2: я попытался настроить Jackson2ObjectMapperBuilderCustomizer, как показано ниже.

@Bean
public Jackson2ObjectMapperBuilderCustomizer init() {
return new Jackson2ObjectMapperBuilderCustomizer() {
  @Override
  public void customize(Jackson2ObjectMapperBuilder builder) {
    builder.timeZone(TimeZone.getTimeZone(ZoneOffset.UTC));
  }
 };
}

Но оба выше не работали для меня. Пожалуйста, дайте мне знать, есть ли другой способ добиться этого. Заранее спасибо.

Просто вопрос, поддерживает ли используемая вами версия Джексона LocalDateTime?

Bilbo Baggins 30.01.2019 13:23

Попробуйте использовать LocalDateTimeFormatter

Supun Dharmarathne 30.01.2019 14:14

Не имея опыта, я предлагаю, чтобы решение объединяло OffsetDateTime с FasterXML/Джексон-модули-java8. Тогда вам больше не понадобится плохо спроектированный и давно устаревший класс TimeZone.

Ole V.V. 30.01.2019 17:18

Не сработало? Каков был результат каждого подхода и чем он отличался от ожидаемого?

Ole V.V. 30.01.2019 17:19

@OleV.V., этот подход работает правильно только с точки зрения сопоставления времени и даты с переменной Java Date, однако я ищу способ, который может вмешаться в процесс, в котором Джексон сопоставляет Json с объектом даты Java и преобразует дату и время по UTC. В настоящее время дата и время, которые сопоставляются, не учитывают смещение часового пояса, которое приходит в запросе JSON "+02:00"

harshad 31.01.2019 07:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 035
2

Ответы 2

LocalDateTime — это поле DateTime без часового пояса.

Из документации:

A date-time without a time-zone in the ISO-8601 calendar system, such as 2007-12-03T10:15:30.

Вместо этого используйте ZonedDateTime.

date-time with a time-zone in the ISO-8601 calendar system, such as 2007-12-03T10:15:30+01:00 Europe/Paris.

javadoc

Да, LocalDateTime не поддерживает сведения о часовом поясе, и, согласно вашему предложению, я попробовал ZonedDateTime, но он только отображает заданную дату и время из даты запроса JSON с часовым поясом UTC и игнорирует смещение часового пояса, указанное в запросе, т.е. 1968-07-21T23 :00:00.000+02:00 просто отображается в объекте даты как 1968-07-21T23:00:00.000 с часовым поясом как UTC без какой-либо корректировки даты и времени. Но в @JsonFormat после добавления timezone = "Europe/Riga" это работает, но это не будет динамически учитывать смещение, указанное в запросе часового пояса.

harshad 31.01.2019 07:53

Используйте класс java.text для выполнения этой работы.

Например

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String date = format.format(new Date());

А затем отправьте его в свой вариант использования.

Пожалуйста, не учите молодежь использовать давно устаревший и заведомо проблемный класс SimpleDateFormat. По крайней мере, не в качестве первого варианта. И не без оговорок. Сегодня у нас намного лучше java.time, современный API даты и времени Java и его DateTimeFormatter.

Ole V.V. 30.01.2019 17:20

Другие вопросы по теме