有没有简单的方法可以更改 dto 和数据库中的实体之间的时区?

问题描述 投票:0回答:2

我使用 Spring Data(postgresql) 在 Spring Boot 上编写应用程序。

我有以下案例。我想将 UTC 时区的时间存储在数据库中,并在 dto 中将其解析为“美国/圣保罗”时区。

例如:在控制器中,我使用美国/圣保罗时区的 LocalDateTime 获取 dto。我想将其保存在 UTC 时区的数据库中。

我可以在从 dto 映射到实体时执行此操作。但也许还有另一种简单的方法,比如设置 hibernate/spring 的一些属性?

spring spring-boot hibernate spring-data
2个回答
0
投票

从 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


0
投票

ไม่มีวิธีง่ายๆในการเปลี่ยนเขตเวลาระหว่างdto แ ละเอนทิตีที่ฐานข้อมูลคุณต้องแปลงเวลาด้วยตัวเ องก่อนบันทึกหรืออ่านจากฐานข้อมูลคุณสามารถใช้คลา ส ZonedDateTime หรือ OffsetDateTime เพื่อจัดการกับเขตเวลาที่แตกต่างกันไ ด้คุณ https://www.baeldung.com/spring-boot-formatting-date-time

© www.soinside.com 2019 - 2024. All rights reserved.