【发布时间】: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