【问题标题】:Change the timestamp timezone in result of jdbc query connection更改 jdbc 查询连接结果中的时间戳时区
【发布时间】:2019-11-08 18:07:57
【问题描述】:

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: java jdbc jackson timestamp amazon-redshift


    【解决方案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 ZONEThis postgres documentation 说:

    • libpq 客户端使用 PGTZ 环境变量在连接时向服务器发送 SET TIME ZONE 命令。

    也许这是一个在打开 JDBC 会话时或每次查询之前始终发送SET TIME ZONE UTC(请参阅Redshift timezone config docs)的选项。

    【讨论】:

    • 谢谢你的回答,但是postgres没有这个问题
    • 不确定 postgres - 但我观察到相同的行为 - 幸运的是没有使用 JDBC 连接,而是使用 psql。我还更新了指向 SET TIME ZONE 文档的链接 - 现在它指向 Redshift。
    【解决方案2】:

    您需要通过使用getTimestamp(String columnLabel, Calendar cal) 方法指定TimeZone 来指定日期为UTC:

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
    
    Timestamp ts = resultset.getTimestamp("TimestampColumn", cal);
    

    正如 javadoc 所说:

    如果底层数据库不存储时区信息,此方法使用给定的日历为时间戳构造适当的毫秒值。

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2013-10-10
      • 2020-07-20
      • 1970-01-01
      • 2018-07-15
      相关资源
      最近更新 更多