我使用 Spring Data(postgresql) 在 Spring Boot 上编写应用程序。
我有以下案例。我想将 UTC 时区的时间存储在数据库中,并在 dto 中将其解析为“美国/圣保罗”时区。
例如:在控制器中,我使用美国/圣保罗时区的 LocalDateTime 获取 dto。我想将其保存在 UTC 时区的数据库中。
我可以在从 dto 映射到实体时执行此操作。但也许还有另一种简单的方法,比如设置 hibernate/spring 的一些属性?
从 Java 8 开始,我们在
java.time
下有了日期/时间 API!
(1) 使用带注释的
@PrePersist
、@PreUpdate
和 @PostLoad
方法转换时区。
例如,在带注释的
@PostLoad
中,从 UTC 转换为 America/San-Paulo。
private static ZoneId UTC_ZONE = ZoneId.of("UTC");
private static ZoneId LOCAL_ZONE = ZoneId.of("America/San_Paulo");
private LocalDateTime dateTime;
@PostLoad
public void toLocal() {
dateTime = dateTime.atZone(UTC_ZONE).withZoneSameInstant(LOCAL_ZONE).toLocalDateTime();
}
(2) 假设您使用 Jackson,您可以编写自定义序列化器/反序列化器。
更新:
对于 PostgreSQL,您可以使用类型
timestamp with time zone
。默认情况下,如果您插入/更新列,它会将值转换为 UTC。
在 JPA 中:
@Column(columnDefinition = "timestamp with time zone")
更新(22-07-01):
您也可以使用
AttributeConverter
。
ไม่มีวิธีง่ายๆในการเปลี่ยนเขตเวลาระหว่างdto แ ละเอนทิตีที่ฐานข้อมูลคุณต้องแปลงเวลาด้วยตัวเ องก่อนบันทึกหรืออ่านจากฐานข้อมูลคุณสามารถใช้คลา ส ZonedDateTime หรือ OffsetDateTime เพื่อจัดการกับเขตเวลาที่แตกต่างกันไ ด้คุณ https://www.baeldung.com/spring-boot-formatting-date-time