Java postgresql和spring引导中的OffsetDateTime问题

Java postgresql和spring引导中的OffsetDateTime问题,java,postgresql,spring-boot,jdbc,Java,Postgresql,Spring Boot,Jdbc,我想保存用户注册时的日期、时间和时区 我在account表中有一个“signup_date”列,它在Java中的类型是OffsetDateTime,在liquibase中的类型是Datetime,在PostgreSQL中的类型是带时区的时间戳 在pgadmin中,我用“2019-08-16T20:42:00+03:30”编写了一个insert查询,但在PostgreSQL中它保存为“2019-08-16 17:12:00+00”,当我通过api获取时,它返回“2019-08-16T21:42:0

我想保存用户注册时的日期、时间和时区

我在account表中有一个“signup_date”列,它在Java中的类型是
OffsetDateTime
,在liquibase中的类型是
Datetime
,在PostgreSQL中的类型是带时区的
时间戳

在pgadmin中,我用“2019-08-16T20:42:00+03:30”编写了一个insert查询,但在PostgreSQL中它保存为“2019-08-16 17:12:00+00”,当我通过api获取时,它返回“2019-08-16T21:42:00+04:30”


为什么会发生这种情况?

在PostgreSQL中,带有时区的时间戳在存储时被标准化为UTC(偏移量0)。该值不保留原始偏移。返回或显示的值将取决于PostgreSQL会话时区、应用程序的时区,可能还取决于其他一些因素。

Rotterveel的回答是正确的,应该接受。在从数据库检索值之后以及在生成控制台中显示的文本期间,控制台会话的善意但令人困惑的特性动态地应用了默认时区,这误导了您

如果使用JDBC,您将不会有这样的困惑

检索

OffsetDateTime myOffsetDateTime = myResultSet.getObject( … , OffsetDateTime.class ) ;
储藏室

OffsetDateTime myOffsetDateTime = OffsetDateTime.parse( "2019-08-16T20:42:00+03:30" ) ;
myPreparedStatement.setObject( … , myOffsetDateTime ) ;