首页 > 解决方案 > Spring-Boot:如何处理时间戳(即在 sql 数据库中保存和获取时间戳)

问题描述

我正在开发一个 Spring Boot 应用程序,但在处理时遇到了问题java.sql.timestamp。当我将时间戳存储到数据库时,它会存储正确的时间戳,但是当我从数据库中获取时间戳时,它会获取时差为 5:30 的时间戳。我得到了有线结果,有时我得到的时间戳与数据库中的时间戳相同,有时我得到的时间戳相差 5:30 小时。我什至使用@JsonFormat(timezone = "GMT+05:30")注释来获得一致的结果。但有时它会给出不同的结果。

标签: javaspringspring-bootsql-timestamp

解决方案


在 SpringBoot 应用程序中读取/写入数据库时​​,有一种更好的方法来处理所有时区问题。

使用 Java8 LocalDateTime 而不是时间戳。创建一个像这样的转换器类来匹配 DB 中的 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;

推荐阅读