Как сохранить OffsetDateTime в PostgreSQL столбец «отметка времени с часовым поясом» - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь сохранить OffsetDateTime("2019-01-14 21:10:00.02+03") с часовым поясом (+03), используя JDBC для PostgreSQL. Но при получении данных с помощью sql-запроса я всегда получаю результат +00. Есть ли способ сохранить смещение (+03) с указанием даты и времени в postgres?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Есть ли способ сохранить смещение (+03) с указанием даты и времени в postgres?

Да, но, как говорит @Andreas, смещение должно быть в отдельном столбце. Имя типа столбца timestamp with time zone в PostgreSQL немного вводит в заблуждение; это действительно просто timestamp converted to utc. Исходное смещение , а не , сохраненное со значением метки времени.

Теперь у вас может возникнуть желание добавить новый столбец varchar и сохранить смещение в виде строки hh:mm, например,

id  twtz                    twtz_offset
--  ----------------------  -----------
 1  2019-01-15 07:00:00+00  -07:00

но на самом деле было бы лучше извлечь смещение в секундах с использованием ZoneOffset#getTotalSeconds() и сохранить его в столбце integer, например,

id  twtz                    twtz_offset
--  ----------------------  -----------
 1  2019-01-15 07:00:00+00       -25200

, поскольку это число может быть применено непосредственно к значению UTC для преобразования обратно в исходное значение OffsetDateTime без необходимости перевода смещения с String на int

OffsetDateTime odtRetrieved = rs.getObject("twtz", OffsetDateTime.class);  // always UTC for PostgreSQL
// odtRetrieved is 2019-01-15T07:00Z
OffsetDateTime odtOriginal = odtRetrieved
        .toInstant()
        .atOffset(ZoneOffset.ofTotalSeconds(rs.getInt("twtz_offset")));
// odtOriginal is 2019-01-15T00:00-07:00

и это также дает дополнительную надёжность на случай, если вы когда-нибудь столкнетесь со смещением странного мяча, которое фактически не является целой минутой.

(Если вы думаете, что никогда не произойдет, следите за предстоящим техническим / ужасным романом Джона Скита "Правила часовых поясов почти сломали мне мозг". Основан на реальной истории. Скоро в книжных магазинах. )

0 голосов
/ 15 января 2019

Postgres хранит все в UTC и не сохраняет первоначальный часовой пояс.

with timezone просто означает, что значение будет преобразовано в часовой пояс сеанса для вас, что не имеет смысла в контексте JDBC, поэтому вы всегда получаете значение в UTC.

Если вам нужно сохранить смещение часового пояса, то вам нужно сохранить его в отдельном столбце.

...