我在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存储正确的时间戳?
答案 0 :(得分:2)
Timestamp类本身知道关于时区的 nothing 。
换句话说:它假设传入的值是UTC。
但是当进一步处理时间戳(并且没有特别设置)时,从Timestamp对象“检索”并推送到数据库中的值会将当前区域设置考虑在内。< / p>
您可以查看here以获取更多想法。 Mikael Valot的答案提供了一些示例,说明如何检索 long 值以便在时区方面传递给TimeStamp构造函数。