更改jdbc查询连接结果中的时间戳时区

时间:2019-06-26 18:14:39

标签: java jdbc jackson timestamp amazon-redshift

我使用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。

我无法更改应用程序和映射器的时区。

如何解决此问题?

2 个答案:

答案 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很可能会共享功能/问题)。

选项1-更改客户端JVM时区

因此,如果这是您的选项,则看起来您可以在JVM中更改时区设置,因为JDBC客户端在连接中使用客户端的时区。

AddVMOption -Duser.timezone=UTC

选项2-在查询之前发送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)的一种选择。