使用哪个时区从Postgres timestampTZ解组OffsetDateTime?

问题描述 投票:1回答:1

[我确实读过https://phili.pe/posts/timestamps-and-time-zones-in-postgresql/,并且了解到timestampTZ是作为UTC时间戳存储的,任何时区/偏移都被转换掉并丢失了。

因此,当加载带有OffsetDateTime字段的JPA /休眠实体时,绑定到这样的timestampTZ字段时,偏移量来自何处?是否总是将其转换为JDBC连接的时区?

这是一种信息截断,实际上我们丢失了原始的时区信息,因此将其设置回jdbc连接所绑定的任何时区,因此,如果需要,我们还需要存储时区信息。需要吗?

如果以上所有条件都成立,使用Instant而不是OffsetBigTime会更清晰/精确吗?OffsetBigTime代表的是UTC时间点,就像timestampTZ所做的一样?然后,我至少必须在代码中显式地应用“适当的时区”,而不是通过某些数据库连接“神奇地”应用它……

java jpa jdbc utc datetimeoffset
1个回答
0
投票

当加载带有OffsetDateTime字段的JPA /休眠实体时,绑定到这样的timestampTZ字段,偏移量来自哪里

虽然我不使用JPA或Hibernate(我使用直接JDBC),但我希望您收到一个OffsetDateTime,其中偏移量是UTC之前/之后的零小时-分钟-秒。我们可以简称为“在UTC”。

您可以自己看。检索OffsetDateTime对象,然后调用toString。如果结果文本的末尾显示+00:00Z,则hat表示偏移量为零。

如果需要,我们还需要存储时区信息?

是的,如果您关心提交给数据库的时区或偏移量,则必须使用自己的额外编程将这些信息自己保存在第二列中。默认情况下,Postgres使用提交的区域或偏移量信息调整为UTC,然后丢弃该区域或偏移量信息。

[在大多数情况下,我认为这是有道理的,因为大多数企业应用程序都不关心原始区域或偏移量。请记住,时刻(时间轴上的点)没有改变。仅挂钟时间显示不同。 Postgres就像冰岛的一个人(UTC是他们全年的永久时区),接到东京或蒙特利尔某个人的电话。如果两个人都抬头看着墙上的时钟,那么东京的人会比冰岛的Postgres人早几个小时。蒙特利尔人看到一天的时间挂在继承人自己的墙上,比冰岛的Postgres人晚几个小时。

© www.soinside.com 2019 - 2024. All rights reserved.