Я работаю над приложением 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));
}
};
}
Но оба выше не работали для меня. Пожалуйста, дайте мне знать, есть ли другой способ добиться этого. Заранее спасибо.
Попробуйте использовать LocalDateTimeFormatter
Не имея опыта, я предлагаю, чтобы решение объединяло OffsetDateTime с FasterXML/Джексон-модули-java8. Тогда вам больше не понадобится плохо спроектированный и давно устаревший класс TimeZone.
Не сработало? Каков был результат каждого подхода и чем он отличался от ожидаемого?
@OleV.V., этот подход работает правильно только с точки зрения сопоставления времени и даты с переменной Java Date, однако я ищу способ, который может вмешаться в процесс, в котором Джексон сопоставляет Json с объектом даты Java и преобразует дату и время по UTC. В настоящее время дата и время, которые сопоставляются, не учитывают смещение часового пояса, которое приходит в запросе JSON "+02:00"




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.
Да, LocalDateTime не поддерживает сведения о часовом поясе, и, согласно вашему предложению, я попробовал ZonedDateTime, но он только отображает заданную дату и время из даты запроса JSON с часовым поясом UTC и игнорирует смещение часового пояса, указанное в запросе, т.е. 1968-07-21T23 :00:00.000+02:00 просто отображается в объекте даты как 1968-07-21T23:00:00.000 с часовым поясом как UTC без какой-либо корректировки даты и времени. Но в @JsonFormat после добавления timezone = "Europe/Riga" это работает, но это не будет динамически учитывать смещение, указанное в запросе часового пояса.
Используйте класс java.text для выполнения этой работы.
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
String date = format.format(new Date());
А затем отправьте его в свой вариант использования.
Просто вопрос, поддерживает ли используемая вами версия Джексона LocalDateTime?