Java 使用jdbc从postgresql查询时间列
我使用的是PostgreSQL 8.4,服务器是linux,linux的时区是“EDT”而不是“UTC”。PostgreSQL的配置将数据库的时区设置为“UTC”。代码正在JBoss9上运行 我有一个sql,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中获取值
从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)然后把它解析成字符串是的,你说的有道理。但是如果两个客户端使用同一台服务器,并且两者都将检索相同的数据。所以我需要将相同的数据转换成不同的时区,我可以得到不同客户端的时区,但是linux服务器的时区会破坏所有这些。默认的Java时区是由客户端操作系统时区设置的,但是没有任何东西阻止您在代码中显式使用不同的时区。我使用IntelliJ调试了代码,远程连接到linux服务器。而且字符串值是错误的“07/09/2017 22:07”
顺便说一句,我的开发环境的时区是-8小时,linux服务器的时区是-4小时,字符串值是-4小时到原始值,所以我的开发环境似乎对值没有影响。我已经做了更多的调查并更改了答案。那有用吗?非常感谢。这就是解决办法。