我在Spring Boot上使用Spring Data(postgresql)编写应用程序。
我有以下案例。我想在数据库中存储UTC时区的时间,并在dto中将它解析为“美洲/圣保罗”时区。
例如:在控制器中,我使用美国/圣保罗时区的LocalDateTime获得dto。我想将其保存在UTC时区的数据库中。
我可以在从 dto 映射到实体时做。但是也许还有另一种简单的方法,例如设置Hibernate/Spring的某些属性?
从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
。