postgresql 一旦实体持久化为timestamptz,Java时区信息是否会丢失?

y0u0uwnf  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我使用java.time.ZonedDateTime创建一个带有时区信息的时间戳:

2022-11-27T22:32:27.697077+09:00[Asia/Tokyo]

我的理解是,当JPA实体插入到数据库中时,它将转换为UTC,因为这是数据库的时区配置。
转换后,数据库中的值为:

2022-11-27 13:32:27.697077+00

基于这种情况:
1.我想知道一旦数据存储在数据库中,[Asia/Tokyo]信息是否会丢失?
1.如何将[Asia/Tokyo]作为原始时区,
1.还是需要我自己手动单独存储这些信息?
Java实体:

@Column(name = "zoned_date_time")
private ZonedDateTime zonedDateTime;

液体基质changeSet

<databaseChangeLog>
    <changeSet author="me" id="1669077010756-1">
       <addColumn tableName="item">
         <column name="zoned_date_time" type="timestamptz"/>
       </addColumn>
    </changeSet>
</databaseChangeLog>

插入数据库之前JVM的输出:

java.time.ZonedDateTime: 2022-11-27T22:32:27.697077+09:00[Asia/Tokyo]

PostgreSQL Docker容器内的查询:
一个

2jcobegt

2jcobegt1#

我想知道[亚洲/东京]的信息一旦存储在数据库中是否会丢失?
是的
我如何将[Asia/Tokyo]作为原始时区,还是需要自己手动单独存储该信息?
可以将UTC日期时间转换为任何时区;因此,如果您已存储时区ID(例如Asia/Tokyo),则可以使用该时区ID恢复原始ZonedDateTime,如下所示:

Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT zoned_date_time FROM item");
while (rs.next()) {
    OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
    ZonedDateTime zdtOriginal = odt.atZoneSameInstant(ZoneId.of("Asia/Tokyo"));
}
rs.close();
st.close();

相关问题