Я просматривал некоторые результаты, которые были представлены из британского часового пояса, который пересек переход на летнее время (для любого не знающего, в утренние часы последнего воскресенья октября 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, и вывод был в лог-файл, который не использует смещений, так что не было бы четкого способа ретроспективного приведения времени. Мне повезло, что порядок действительно показывает разницу, но предположим, что в течение такого двухчасового периода было только одно событие, что было бы наилучшей практикой для решения этой (достаточно нерегулярной) проблемы в будущем? Можно ли показывать смещения только в эти периоды или есть какое-то другое решение?