我使用Redshift和jdbc。
Redshift服务器show timezone;
的时区为UTC。
我的应用程序(jvm)时区为+2。
当我通过jdbc执行查询时,选择SYSDATE;我在UTC中获得了具有正确值的正确时间戳记,但是不幸的是,该值的时区为+2。
例如:
服务器有2019-06-26T18:10:13.000+0-00
,但我有2019-06-26T18:10:13.000+0200
。
此后,我通过杰克逊(Jackson)将时间戳映射到json并将响应发送给客户端,客户端获得了不正确的值2019-06-26T16:10:13.000 + 0000。
我无法更改应用程序和映射器的时区。
如何解决此问题?
答案 0 :(得分:1)
您需要通过使用getTimestamp(String columnLabel, Calendar cal)
方法指定TimeZone
来指定日期为UTC:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
Timestamp ts = resultset.getTimestamp("TimestampColumn", cal);
如Javadoc所说:
如果基础数据库未存储时区信息,则此方法使用给定的日历为时间戳构造一个适当的毫秒值。
答案 1 :(得分:1)
我似乎JDBC驱动程序没有用于设置客户端时区的参数。 This is a similar question for postgres(并且redshift和postgres很可能会共享功能/问题)。
因此,如果这是您的选项,则看起来您可以在JVM中更改时区设置,因为JDBC客户端在连接中使用客户端的时区。
AddVMOption -Duser.timezone=UTC
SET SESSION TIME ZONE
我知道在psql
中,您可以通过设置PGTZ
环境变量来控制客户端的时区(我使用它来连接到Redshift并以所需的形式获取TIMESTAMP WITHOUT TIME ZONE
。{{3 }}说:
- libpq客户端使用PGTZ环境变量在连接时将SET TIME ZONE命令发送到服务器。
也许这是在打开JDBC会话时或每次查询之前始终发送SET TIME ZONE UTC
(请参阅This postgres documentation)的一种选择。