Существует лучший способ решения всех проблем с часовыми поясами при чтении / записи в базу данных в приложениях SpringBoot.
Используйте Java8 LocalDateTime вместо Timestamp.Создайте такой класс преобразователя, чтобы он соответствовал метке времени в DB и LocalDateTime в вашем приложении:
@Converter(autoApply = true)
public class LocalDateTimeAttributeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
@Override
public Timestamp convertToDatabaseColumn(LocalDateTime locDateTime) {
return (locDateTime == null ? null : Timestamp.valueOf(locDateTime));
}
@Override
public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
}
}
Установите часовой пояс вашего приложения по умолчанию в вашем основном классе:
@SpringBootApplication
public class ExampleApplication {
private static final String ZONE_ID_ISTANBUL = "Europe/Istanbul";
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone(ZONE_ID_ISTANBUL));
System.out.println("Application time zone: " + TimeZone.getDefault().getID());
SpringApplication.run(ExampleApplication.class, args);
}
}
Установив часовой пояс по умолчаниювсякий раз, когда вы используете LocalDateTime, он будет использовать этот часовой пояс по умолчанию, поэтому даже если ваша база данных работает в другом часовом поясе с вашим приложением, вы будете запускать свой код в своем часовом поясе.
Обратите внимание, что после создания конвертеракласс, вы должны использовать его в вашей сущности следующим образом:
@Column(name = "insert_time", nullable = false)
@Convert(converter = LocalDateTimeAttributeConverter.class)
private LocalDateTime insertTime;