【问题标题】:UTC timestamp -> java.sql.Timestamp -> jOOQ -> local timestamp in postgreSQL?UTC 时间戳 -> java.sql.Timestamp -> jOOQ -> postgreSQL 中的本地时间戳?
【发布时间】:2017-07-04 01:01:15
【问题描述】:

我在 GMT+1 时区,我在 long 变量中有一个 UTC 时间戳 (11:12:56)。

long ts = 1487157176450;

我从这个时间戳初始化一个java.sql.Timestamp

Timestamp timestamp = new Timestamp(ts);

然后,我使用 jOOQ 将此时间戳插入到 PostgreSQL (v9.4) 数据库中。

create.insertInto(TABLE,
    TABLE.NAME, TABLE.TS)
  .values("Foo bar", timestamp);

但是,当我记录了实际执行的 SQL 命令时,我看到了:

< 2017-02-15 10:50:37.326 CET >LOG:  execute <unnamed>: insert into "database"."table" ("name", "ts") values ($1, cast($2 as timestamp))
< 2017-02-15 10:50:37.326 CET >DETAIL:  parameters: $1 = 'Foo bar', $2 = '2017-02-15 12:12:56.450'

我不完全确定时间戳在哪里变成了本地时间戳,但除非 pgAdmin 撒谎,否则我实际上确实将 GMT+1 时间戳存储在数据库中,而不是我想要的 UTC。

现在,由于我没有使用 JDBC,因此对链接问题的回答没有帮助。如何让 jOOQ 存储正确的时间戳?

【问题讨论】:

  • 您可以为您的客户将时区设置为 UTC,或者使用显式转换 cast($2 as timestamptz) 我想
  • JDBC 规范要求时间戳在 JVM 默认时区中发送,除非 1) 通过传递带有正确时区的 Calendar 明确指定,2) 插入到具有特定时区的列中, 3) 使用java.time.OffsetDateTime
  • 我注意到您尚未接受任何答案。请考虑在某个时候这样做。

标签: java postgresql jdbc jooq


【解决方案1】:

Timestamp 类本身对时区一无所知

换句话说:它假设传入的值是UTC。

但是当时间戳被进一步处理(并且没有具体设置)时,从时间戳对象“检索”并推送到数据库中的值会考虑您的当前语言环境。

您可以查看here 以获得更多想法。 Mikael Valot 的回答提供了一些示例,您可以如何检索 long 值,以将其传递给关于时区的 TimeStamp 构造函数。

【讨论】:

  • 对,那么我如何告诉 jOOQ(假设这是罪魁祸首)不要将时间戳翻译成我当前的语言环境?
  • @TomášM.:这与 jOOQ 无关(它只是将 Timestamp 传递给 JDBC),而是 JDBC / PostgreSQL 问题。您可能希望使用 timestamp with time zone 作为 PostgreSQL 数据类型,并在 jOOQ 中应用正确的数据类型绑定,将其映射到 java.time.OffsetDateTime
  • 感谢 Lukas,这确实解决了问题。
猜你喜欢
  • 2019-08-15
  • 2019-03-09
  • 2017-06-15
  • 2014-11-21
  • 2011-02-06
  • 2019-01-05
  • 2013-03-23
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多