【问题标题】:OffsetDateTime problem in postgresql and spring bootpostgresql和spring boot中的OffsetDateTime问题
【发布时间】:2019-12-23 08:20:56
【问题描述】:
我想在用户注册时保存用户的日期、时间和时区。
我在帐户表中有一个“signup_date”列,它在 Java 中的类型是 OffsetDateTime,在 liquibase 中是 Datetime,在 PostgreSQL 中是 timestamp with time zone。
在 pgadmin 中,我使用“2019-08-16T20:42:00+03:30”编写了一个插入查询,但在 PostgreSQL 中它保存为“2019-08-16 17:12:00+00”,当我通过 api 获取它返回 '2019-08-16T21:42:00+04:30'
为什么会这样?
【问题讨论】:
标签:
java
postgresql
spring-boot
jdbc
【解决方案1】:
在 PostgreSQL 中,TIMESTAMP WITH TIMEZONE 在存储时被标准化为 UTC(偏移量 0)。该值不保留原始偏移量。返回或显示的值将取决于 PostgreSQL 会话时区、应用程序的时区,可能还取决于其他一些因素。
【解决方案2】:
Rotteveel 的答案是正确的,应该被接受。您被控制台会话的善意但令人困惑的功能误导了,该功能在从数据库中检索值之后以及在控制台中显示的文本生成过程中动态应用默认时区。
如果使用 JDBC,您将不会有这样的困惑。
检索。
OffsetDateTime myOffsetDateTime = myResultSet.getObject( … , OffsetDateTime.class ) ;
存储。
OffsetDateTime myOffsetDateTime = OffsetDateTime.parse( "2019-08-16T20:42:00+03:30" ) ;
myPreparedStatement.setObject( … , myOffsetDateTime ) ;