提问者:小点点

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


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

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

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

我可以在从 dto 映射到实体时做。但是也许还有另一种简单的方法,例如设置Hibernate/Spring的某些属性?


共1个答案

匿名用户

从Java8开始,我们在java. time下有了Date/Time API!

(1)在带注释的< code>@PrePersist 、< code>@PreUpdate和< code>@PostLoad方法中转换时区。

例如,在带注释的@PostLoad中,从UTC转换为美国/圣保罗。

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,您可以使用< code > timestamp with time zone 类型。默认情况下,如果插入/更新列,它会将值转换为UTC。

在JPA中:

@Column(columnDefinition = "timestamp with time zone")

更新(22-07-01):

您也可以使用AttributeConverter