Postgres "часовой пояс в" не учитывает стандартное время в горах при конвертации - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть столбец starts_at с типом TIMESTAMP WITHOUT TIME ZONE, поскольку он представляет время встречи и не должен изменяться во время смены летнего времени.

Однако наша библиотека, которая обрабатывает повторяющиеся встречи, нуждается в этомвремя в UTC.Я пытаюсь преобразовать starts_at в UTC, но вижу, что получаю времена, представляющие MDT (летнее время), а не MST (стандартное время).

Например, возьмите следующее:

SELECT starts_at, timezone('America/Denver', starts_at) AS new_starts_at

Я ожидал бы получить следующий результат:

--------------------------------------------------
| starts_at              | new_starts_at
--------------------------------------------------
| 2018-09-04 13:05:00    |  2018-09-04 20:05:00+00

Вместо этого я получаю следующее:

--------------------------------------------------
| starts_at              | new_starts_at
--------------------------------------------------
| 2018-09-04 13:05:00    |  2018-09-04 19:05:00+00

new_starts_at должен возвращаться в MST, что будет 2018-09-04 20:05:00+00.У меня сложилось впечатление, что использование часового пояса Олсена (America/Denver) сообщит Postgres о том, был ли сдвиг DST на месте.Если я заменим America/Denver на MST, я увижу правильный результат.

Я уверен, что это просто неправильное понимание типов часовых поясов Postgres с моей стороны.Тем не менее, заранее спасибо за образование!

1 Ответ

0 голосов
/ 22 ноября 2018

Выражение timezone('America/Denver', starts_at) интерпретирует starts_at как местное время в Денвере, результатом является timestamp with time zone.

Теперь, когда вы выводите это значение, оно преобразуется в ваш часовой пояс сеанса, которыйв UTC.

13: 05 в Денвере - это 19:05 в UTC, что является часовым поясом вашего сеанса.

В летнее время Денвер смещен на 6 часов от UTC.

...