Spring- Boot: как обрабатывать временную метку (т.е. сохранять и получать временную метку в базу данных sql и из нее) - PullRequest
0 голосов
/ 09 октября 2018

Я разрабатываю приложение для весенней загрузки, и у меня возникают проблемы с обработкой java.sql.timestamp.Когда я сохраняю метку времени в базе данных, она сохраняет правильную метку времени, но когда я выбираю метку времени из базы данных, она выбирает метку времени с разницей в 5:30 часов.Я получаю проводной результат, иногда я получаю ту же метку времени, что и в базе данных, а иногда я получаю метку времени с разницей в 5:30 часов.Я даже использовал аннотацию @JsonFormat(timezone = "GMT+05:30"), чтобы получить согласованные результаты.Но иногда это дает разные результаты.

1 Ответ

0 голосов
/ 09 октября 2018

Существует лучший способ решения всех проблем с часовыми поясами при чтении / записи в базу данных в приложениях 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;
...