如何防止Hibernate在持久化到PostgreSQL"带时区的时间戳"时将ZonedDateTi



设置:

休眠:5.4.32
SpringBoot:2.5.4
org.postgresql:postgresql:42.23

我有一个班级和桌子

@Entity
public class MyType{
@Id
@GeneratedValue(generator = "uuid2")
@Type(type = "uuid-char")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private UUID id;
@Column
public ZonedDateTime time;
public MyType(){}
// omitting getters and setters
}
create table if not exists my_type
(
id text not null
constraint idx_16559_pk__data_fil__3213e83ff1283b3a
primary key,
time timestamp with time zone
)

问题

我想要实现的是在写入数据库时保留MyType.time中的时区信息。无论我尝试什么,它总是转换为UTC。有一个选项(hibernate.jdbc.time_zone)可以设置特定的时区,但我想将ZonedDateTime实例保留为不同的时区,由于Java和Postgres有一种类型,我希望有一些方法可以实现这一点。

对我来说,最糟糕的情况是将其存储为字符串,然后手动进行反序列化。

在Postgres中,TIMESTAMP WITH TIME ZONE实际上以UTC格式将其日期存储在数据库中。

";"时区";意味着它希望在插入期间指定时区,并将指定的时间转换为UTC。通过这样做,它可以使所有时间戳正常化,如果你想比较或排序日期,这是有意义的。

因此,数据库不会存储时区,您需要另一种方法来存储或确定时区

所有可识别时区的日期和时间都存储在UTC内部(PostgreSQL文档)

您可以将时区视为一种";格式化";为您的用户。每个用户都可以有自己的时区,相同的日期应该以不同的方式格式化。它仍然是相同的值,只是以不同的方式显示。

从这个角度来看,只在用户的设置或配置文件中存储一个时区可能是有意义的。

在我看来,这甚至不应该由API进行格式化。它应该由前端完成。如果用户的用户偏好中没有设置时区,那么实际上可以使用客户端操作系统的时区或网络浏览器的时区。