有没有简单的方法来更改 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")
我在 Spring 上使用 Spring 数据(postgresql)引导编写应用程序。
我有以下案例。我想在 UTC 时区存储数据库时间,并在 dto 中解析它 to/from "America/San-Paulo" 时区。
例如:在控制器中,我在 America/San-Paulo 时区使用 LocalDateTime 获取 dto。我想将它保存在 UTC 时区的数据库中。
我可以在从 dto 映射到实体时执行 in。但也许还有另一种简单的方法,比如设置 hibernate/spring?
的一些属性从 Java 8 开始,我们在 java.time
!
(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")