2017-02-15 2 views
2

Я нахожусь в часовом поясе 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 сохранить правильную метку времени?

+0

Вы можете установить часовой пояс для UTC для своего клиента или использовать явное приведение cast ($ 2 как timestamptz). Я полагаю, –

+0

. Спецификация JDBC требует, чтобы временная метка JVM была отправлена ​​по метке времени, если 1) явно не указано передавая «Календарь» с нужным часовым поясом, 2) вставляя в столбец с определенным часовым поясом, 3) используя 'java.time.OffsetDateTime' –

ответ

1

Класс времени сам знает ничего о часовых поясах.

Иными словами: предполагается, что входящее значение - UTC.

Но когда временная метка обрабатывается (и ничего конкретно не задано), значение, которое «извлекается» из объекта Timestamp и помещается в базу данных, учитывает ваш текущий.

Вы можете посмотреть here для дальнейших мыслей. Ответ Mikael Valot дает несколько примеров того, как вы можете получить длинные значения, которые будут переданы конструктору TimeStamp в отношении часовых поясов.

+0

Правильно, так как я могу сказать jOOQ (предполагая, что это преступник) не перевести временную метку в мой текущий язык? –

+0

@ TomášM. См. Также https://blog.jooq.org/tag/time-zones/ и http://stackoverflow.com/questions/27913735/jooq-timestamp-being-stored-with-local-timezone-offset –

+1

@ TomášM. : Это не связано с jOOQ (которое просто передает «Timestamp» в JDBC), но проблема JDBC/PostgreSQL. Вероятно, вы хотите использовать «временную метку с часовым поясом» в качестве типа данных PostgreSQL и применять правильное привязку типа данных в jOOQ, чтобы сопоставить это с «java.time.OffsetDateTime» –

Смежные вопросы