Spring- Boot: как обрабатывать временную метку (т.е. сохранять и получать временную метку в базу данных sql и из нее)
Я разрабатываю приложение для весенней загрузки, и у меня возникают проблемы с обработкой java.sql.timestamp
, Когда я сохраняю метку времени в базе данных, она сохраняет правильную метку времени, но когда я выбираю метку времени из базы данных, она выбирает метку времени с разницей в 5:30 часов. Я получаю проводной результат, иногда я получаю ту же метку времени, что и в базе данных, а иногда я получаю метку времени с разницей в 5:30 часов. Я даже использовал @JsonFormat(timezone = "GMT+05:30")
аннотация, чтобы получить согласованные результаты. Но иногда это дает разные результаты.
1 ответ
Существует лучший способ справиться со всеми проблемами часового пояса при чтении / записи в базу данных в приложениях SpringBoot.
Используйте Java8 LocalDateTime вместо Timestamp. Создайте такой класс преобразователя, чтобы он соответствовал метке времени в БД и 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;