Есть ли способ сохранить смещение (+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
и это также дает дополнительную надёжность на случай, если вы когда-нибудь столкнетесь со смещением странного мяча, которое фактически не является целой минутой.
(Если вы думаете, что никогда не произойдет, следите за предстоящим техническим / ужасным романом Джона Скита "Правила часовых поясов почти сломали мне мозг". Основан на реальной истории. Скоро в книжных магазинах. )