Linux или Windows, не важно.
Версия PostgreSQL от 14 до 15.3 минимум.
set time zone 'Antarctica/Syowa';
select '1947-01-01 08:00:00'::timestamptz,
'1948-01-01 08:00:00'::timestamptz,
'1947-01-01 08:00:00'::timestamptz at time zone 'ETC/UTC';
Результат:
Итак, это просто неправильный часовой пояс, потому что правый — это смещение +3 от UTC.
И это более того. Некоторые часовые пояса показывают неправильный результат с разными годами в правом верхнем углу:
Азия/Актау - начало 1931 года.
Индия/Коморо - начало 1943 г.
и так далее...
Что происходит с часовыми поясами?
@Фрэнк Хейкенс SELECT name, abbrev, utc_offset, is_dst FROM pg_timezone_names;
Как это связано с датой 1947 года?
Я хочу, чтобы все часовые пояса со всеми датами были равны списку выше. Меня не волнует, какие часовые пояса или правила были, например, до 1947 года.
Но часовые пояса со временем меняются — любая модель, которая всегда настаивает на одном смещении UTC, просто будет неточной. Какая для вас польза от этой неточности?
@Джон Скит Хорошо. Возможно, я увлекся. Это всего лишь небольшой вариант использования timetz, который необходимо извлечь из некоторой отметки времени. Я сохранил строку по умолчанию со значением 1700-01-02 08:00:00+[некоторый часовой пояс] в качестве времени начала рабочего дня. Но схема таблицы была изменена, и теперь это поле нужно преобразовать в поле timetz с часовым поясом +00 (не спрашивайте, почему). Но это не удалось из-за правил часового пояса, и сценарий миграции необходимо исправить.





Итак, это просто неправильный часовой пояс, потому что правый — это смещение +3 от UTC.
Нет, это не так - по крайней мере, согласно базе данных часовых поясов IANA, которую, как я подозреваю, использует Postgres.
Лично я использую свою собственную страницу Noda Time tzvalidate для проверки этих вещей, но она основана на данных, которые вы можете увидеть в GitHub в репозитории Пола Эггерта или загрузить из IANA, но их проще просмотреть на GitHub.
В файле backward вы можете видеть, что Antarctica/Syowa является ссылкой на Asia/Riyadh, а в файле asia мы видим следующие правила:
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
3:00 - %z
Так что, по сути, Postgres делает именно то, что я ожидал для этого источника данных.
Почему вы думаете, что это неправильно? Какой источник вы использовали для получения «правды» о часовых поясах?