UTC时间戳 - > java.sql.Timestamp - > jOOQ - > postgreSQL中的本地时间戳?

时间:2017-02-15 11:31:55

标签: java postgresql jdbc jooq

我在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存储正确的时间戳?

1 个答案:

答案 0 :(得分:2)

Timestamp类本身知道关于时区的 nothing

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

但是当进一步处理时间戳(并且没有特别设置)时,从Timestamp对象“检索”并推送到数据库中的值会将当前区域设置考虑在内。< / p>

您可以查看here以获取更多想法。 Mikael Valot的答案提供了一些示例,说明如何检索 long 值以便在时区方面传递给TimeStamp构造函数。