Java 使用jdbc从postgresql查询时间列

Java 使用jdbc从postgresql查询时间列,java,postgresql,jdbc,timezone,timestamp-with-timezone,Java,Postgresql,Jdbc,Timezone,Timestamp With Timezone,我使用的是PostgreSQL 8.4,服务器是linux,linux的时区是“EDT”而不是“UTC”。PostgreSQL的配置将数据库的时区设置为“UTC”。代码正在JBoss9上运行 我有一个sql,从ts_条目中选择作为提交日期格式的字符(ts_entry.submitted_date,'MM/DD/yyyyy HH24:MM'),其中.. 如果我们在PostgreSQL中运行sql,我们将得到值“07/10/2017 02:07” 但是当我试图从java中的resultSet中获取值

我使用的是PostgreSQL 8.4,服务器是linux,linux的时区是“EDT”而不是“UTC”。PostgreSQL的配置将数据库的时区设置为“UTC”。代码正在JBoss9上运行

我有一个sql,
从ts_条目中选择作为提交日期格式的字符(ts_entry.submitted_date,'MM/DD/yyyyy HH24:MM'),其中..

如果我们在PostgreSQL中运行sql,我们将得到值“
07/10/2017 02:07

但是当我试图从java中的
resultSet
中获取值时

Statement st = connection.createStatement(); 
ResultSet rs = st.executeQuery(sql); 
String value = rs.getString("submitted_date_format");
该值将为“
07/09/2017 22:07
”。 以DB为单位的原点值为“
2017-07-10 02:02:25.268+00

如何在代码级别处理linux服务器时区造成的影响


顺便说一句,我知道另一种解决方案,更改jboss的启动脚本,使jboss使用时区“UTC”启动。是否可以在代码级别处理此问题?

数据库服务器计算机的时区对行为没有直接影响,只是用于在
postgresql.conf
中初始化
时区,这是客户端时区的初始设置,除非被数据库会话覆盖

PostgreSQL在UTC内部存储带时区的时间戳,并在交付时将其转换为客户端的本地时区

因此,您应该按照需要的方式设置数据库会话时区

SET TIME ZONE '<time zone name>';
设置时区“”;

当您从PostgreSQL中选择then时,它会将日期转换为该时区。

java的
LocalDateTime
应该能够实现这一功能,但resultSet中的值类型是“String”,如果数据库列是date/datetime,则ResultSetOrry中会有类似date或timestamp的内容,以避免提及它,DB中的列类型是timestamp,但我想获取格式化的日期,而不是原始值。格式化日期为“字符串”,原始值为“时间戳”,取原始值,将其转换为
java.util.date
然后调用
d.setHours(d.getHours()-4)“07/09/2017 22:07”
顺便说一句,我的开发环境的时区是-8小时,linux服务器的时区是-4小时,字符串值是-4小时到原始值,所以我的开发环境似乎对值没有影响。我已经做了更多的调查并更改了答案。那有用吗?非常感谢。这就是解决办法。