java - Spring-Boot:如何处理时间戳(即在 sql 数据库中保存和获取时间戳)
问题描述
我正在开发一个 Spring Boot 应用程序,但在处理时遇到了问题java.sql.timestamp
。当我将时间戳存储到数据库时,它会存储正确的时间戳,但是当我从数据库中获取时间戳时,它会获取时差为 5:30 的时间戳。我得到了有线结果,有时我得到的时间戳与数据库中的时间戳相同,有时我得到的时间戳相差 5:30 小时。我什至使用@JsonFormat(timezone = "GMT+05:30")
注释来获得一致的结果。但有时它会给出不同的结果。
解决方案
在 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;
推荐阅读
- firebase - 为什么我无法将我的 Google Firebase 计划从 spark 升级到 blaze?
- php - Wordpress sql查询结果与phpmyadmin中的sql查询查询不同的顺序
- node.js - 如何在身份验证中检查令牌
- api - 使用 IAsyncEnumerable
作为 ASP.NET Web API 中的 API 输出 - mesh - OpenFOAM blockMesh 圆柱网格及其 paraFoam 绘制面法线
- r - geom_sf 具有连续值和 NA ggplot R
- jakarta-ee - Vaadin 延迟加载网格错误:java.lang.IndexOutOfBoundsException:索引 0 超出长度 0 的范围
- sql - Scope_identity 给出空值?
- python - MATLAB 类型转换函数的等效 Python 函数
- python - admin_order_field 未按降序排序