Подход № 1: Установка часового пояса по умолчанию
Вы можете установить часовой пояс в формате даты, используемом ObjectMapper
. Он будет использоваться для Date
и подклассов:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);
В приложениях Spring для настройки ObjectMapper
вы можете сделать следующее:
@Bean
public ObjectMapper objectMapper() {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(dateFormat);
return mapper;
}
В Spring Boot вы можете использовать свойство spring.jackson.time-zone
для определения часового пояса:
spring.jackson.time-zone: Europe/Berlin
Подробнее об общих свойствах приложения см. В документации .
Подход № 2. Использование Java 8 Date & Time API
Вместо использования Timestamp
вы можете рассмотреть LocaDateTime
из JSR-310 . Он был введен в Java 8. "локальные" классы даты и времени (LocalDateTime
, LocalDate
и LocalTime
) не привязаны ни к одной местности или часовому поясу. Из LocalDateTime
документации:
Этот класс не хранит и не представляет часовой пояс. Вместо этого, это описание даты, используемой для дней рождений, в сочетании с местным временем, показанным на настенных часах. Он не может представлять момент на временной шкале без дополнительной информации, такой как смещение или часовой пояс.
Этот ответ даст вам более подробную информацию о новых классах даты и времени.
Джексон имеет модуль, который поддерживает типы JSR-310. Добавьте его в свои зависимости:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.9</version>
</dependency>
Затем зарегистрируйте модуль JavaTimeModule
в вашем ObjectMapper
экземпляре:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Большинство типов JSR-310 будут сериализованы с использованием стандартного строкового представления ISO-8601 . Если вам нужен собственный формат, вы можете использовать свой собственный сериализатор и десериализатор.
Подробнее см. документацию .