Различение между временами при переходе на летнее время - PullRequest
3 голосов
/ 28 октября 2019

Я просматривал некоторые результаты, которые были представлены из британского часового пояса, который пересек переход на летнее время (для любого не знающего, в утренние часы последнего воскресенья октября 1 час повторяется, чтобы вычесть час, и аналогично нав последнее воскресенье марта он сдвигается вперед на 1 час). Вывод показал события, которые, казалось, пошли назад во времени - очевидно, это результат сброса часов, однако без каких-либо списков смещения по времени единственным логичным способом установить правильное время было увидеть их порядок. Я понимаю, что Postgres хранит временную метку с часовым поясом внутри UTC, но когда указан часовой пояс, смещение пропускается, например:

select
    '2019-10-27 00:30:00 UTC'::timestamptz at time zone 'Europe/London' time1,
    '2019-10-27 01:30:00 UTC'::timestamptz at time zone 'Europe/London' time2,
    '2020-03-29 00:30:00 UTC'::timestamptz at time zone 'Europe/London' time3,
    '2020-03-29 01:30:00 UTC'::timestamptz at time zone 'Europe/London' time4;

Ниже вы можете увидеть, что в октябрьских переключениях будет точно такое же время в 00:30 и 01: 30 period, но он не отображает смещение часового пояса, поэтому невозможно определить разницу между ними.

        time1        |        time2        |        time3        |        time4        
---------------------+---------------------+---------------------+---------------------
 2019-10-27 01:30:00 | 2019-10-27 01:30:00 | 2020-03-29 00:30:00 | 2020-03-29 02:30:00

Это, очевидно, не просто проблема, которая затрагивает только Postgres, и вывод был в лог-файл, который не использует смещений, так что не было бы четкого способа ретроспективного приведения времени. Мне повезло, что порядок действительно показывает разницу, но предположим, что в течение такого двухчасового периода было только одно событие, что было бы наилучшей практикой для решения этой (достаточно нерегулярной) проблемы в будущем? Можно ли показывать смещения только в эти периоды или есть какое-то другое решение?

1 Ответ

2 голосов
/ 28 октября 2019

Решение простое: не регистрируйте локальные метки времени.

Либо регистрируйте информацию о часовом поясе вместе с метками времени, либо преобразуйте их в UTC перед регистрацией:

SET timezone = 'Europe/London';

select                         
    '2019-10-27 00:30:00 UTC'::timestamptz time1,
    '2019-10-27 01:30:00 UTC'::timestamptz time2,
    '2020-03-29 00:30:00 UTC'::timestamptz time3,
    '2020-03-29 01:30:00 UTC'::timestamptz time4;

         time1          |         time2          |         time3          |         time4          
------------------------+------------------------+------------------------+------------------------
 2019-10-27 01:30:00+01 | 2019-10-27 01:30:00+00 | 2020-03-29 00:30:00+00 | 2020-03-29 02:30:00+01
(1 row)

select                         
    '2019-10-27 00:30:00 UTC'::timestamptz at time zone 'UTC' time1,
    '2019-10-27 01:30:00 UTC'::timestamptz at time zone 'UTC' time2,
    '2020-03-29 00:30:00 UTC'::timestamptz at time zone 'UTC' time3,
    '2020-03-29 01:30:00 UTC'::timestamptz at time zone 'UTC' time4;

        time1        |        time2        |        time3        |        time4        
---------------------+---------------------+---------------------+---------------------
 2019-10-27 00:30:00 | 2019-10-27 01:30:00 | 2020-03-29 00:30:00 | 2020-03-29 01:30:00
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...