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

Is there simple way of changing timezone between dto and entities at database?

我在 Spring 上使用 Spring 数据(postgresql)引导编写应用程序。

我有以下案例。我想在 UTC 时区存储数据库时间,并在 dto 中解析它 to/from "America/San-Paulo" 时区。

例如:在控制器中,我在 America/San-Paulo 时区使用 LocalDateTime 获取 dto。我想将它保存在 UTC 时区的数据库中。

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

的一些属性

从 Java 8 开始,我们在 java.time!

下有 Date/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,你可以写一个自定义的serializer/deserializer.

更新:

对于 PostgreSQL,您可以使用类型 timestamp with time zone。默认情况下,如果您 insert/update 该列,它会将值转换为 UTC。

在 JPA 中:

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