我在 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 存储正确的时间戳?
最佳答案
Timestamp 类本身对时区一无所知。
换句话说:它假设传入的值是UTC。
但是当时间戳被进一步处理时(没有特别设置),从时间戳对象“检索”并插入数据库的值会考虑您的当前区域设置。
可以看看here进一步思考。 Mikael Valot 的回答给出了一些示例,您可以如何检索要传递给有关时区的 TimeStamp 构造函数的 long 值。
关于java - UTC 时间戳 -> java.sql.Timestamp -> jOOQ -> postgreSQL 中的本地时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248170/