Я нахожусь в часовом поясе GMT + 1, и у меня есть временная метка UTC (11:12:56) в переменной long
.UTC timestamp -> java.sql.Timestamp -> jOOQ -> локальная метка времени в postgreSQL?
long ts = 1487157176450;
Я инициализировать java.sql.Timestamp
от этой метки времени.
Timestamp timestamp = new Timestamp(ts);
Затем вставить эту метку времени в базу данных PostgreSQL (v9.4) с использованием jOOQ.
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 как timestamptz). Я полагаю, –
. Спецификация JDBC требует, чтобы временная метка JVM была отправлена по метке времени, если 1) явно не указано передавая «Календарь» с нужным часовым поясом, 2) вставляя в столбец с определенным часовым поясом, 3) используя 'java.time.OffsetDateTime' –