Почему часовой пояс имеет такое сумасшедшее смещение от UTC в 0001 году в Postgres?

16

В Postgres 9.5 я был удивлен, увидев результат, показанный ниже, когда экспериментировал с годом 0001(без года ноль 0000).

Смещение -07:52:58?

Пример кода. Обратите внимание, что я смешал использование TIMESTAMP WITH TIME ZONEи TIMESTAMP WITHOUT TIME ZONE, так что читайте внимательно.

SET TIME ZONE 'America/Los_Angeles' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', 
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ;

("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00")

Я удивлен этим вторым значением 0001-12-31 16:07:02-07:52:58 BC. Я понимаю, что мы должны вернуться назад на восемь часов, а America/Los_Angelesна восемь часов отставать от UTC со смещением -08:00. Но вместо -08:00смещения есть -07:52:58. Почему?

Нет проблем под UTC

Нет такой проблемы при вводе данных под UTC.

SET TIME ZONE 'UTC' ;

SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0',  
        TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', 
        TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z');

("2015-01-01 00:00:00+00","0001-01-01 00:00:00+00","0001-01-01 00:00:00")

Нет года ноль

Кстати, часть даты кажется правильной. Кажется , нет года 0000, что является точкой поворота между «BC» и «AD» эр. Возьмите первый момент года 0001, вычтите час, и вы получите год 0001 BC- так что без года ноль.

SET TIME ZONE 'UTC' ;

INSERT INTO moment_  -- TIMESTAMP WITH TIME ZONE.
VALUES ( TIMESTAMP '0001-01-01 00:00:00.0Z' - INTERVAL '1 hour' ) ;

SET TIME ZONE 'UTC' ;

TABLE moment_ ;

Результат - год 0001 BC, поэтому мы прыгаем с 0001на 0001 BC; нет года ноль 0000.

"0001-12-31 23:00:00+00 BC"
Базилик Бурк
источник
Также прекрасное видео о безумии часовых поясов
billinkc
Опорная точка между BC и AD - год 1. Это либо год 1, либо год -1. Это просто, как годы названы изначально. Год 0 не существует (или, скорее, не определен, так как это скорее проблема определения, нежели экзистенциальная).
Slebetman
Помните, как во времена празднования 2000 года некоторые педантисты говорили, что второе тысячелетие технически начинается в 2001 году, а не в 2000 году? Поэтому. Годы начинаются с 1, а не с 0. А годом до 1 года является 1 год до нашей эры (т.е. год -1)
slebetman
1
@slebetman, который зависит от используемого календаря. Григорианский пролептик имеет как форму, которая использует 0 как год до 1 CE, так и форму, которая помещает 1 BCE непосредственно перед 1 CE (ISO 8601 поддерживает как наличие 0000действительного значения года, но не настаивает на том, используется ли он или нет). ). Это правда, что PostgreSQL использует форму без года 0, но вы не можете утверждать, что «годы начинаются с 1, а не 0», как если бы это был какой-то универсальный факт. Легко переводить между ними, например, для астрономических данных. (Третье тысячелетие все же началось в 2001 году в любом случае, так как оно оставалось третьим тысячелетием с 1 года н.э.)
Джон Ханна
@JonHanna: На самом деле никто не использовал какую-либо форму пролептического григорианского календаря в то время, поэтому я думаю, что было бы справедливо отдать предпочтение юлианскому календарю, который не имеет нулевого года.
Кевин

Ответы:

22

18 ноября 1883 года в 12:00 (новое время) американские железные дороги приняли стандартное время.

Это означает, что до этого времени Лос-Анджелес использовал фактическое местное время, основанное на среднем солнечном времени. После этого он был перемещен в местный часовой пояс, который, будучи интегральным смещением часов от среднего времени по Гринвичу, немного отличался от предыдущего времени.

Хотите узнать больше?

  • Загрузите базу данных часовых поясов tzdata из IANA: Часовые пояса .

  • Внутри вы найдете определения (многих) часовых поясов, которые имеют много вариаций во времени, а также множество комментариев, детализирующих, какие изменения были сделаны и когда. Это занимательное чтение!

  • В Википедии также есть несколько интересных фактов на странице Википедии: Часовой пояс , относительно изменения 1883 года, 18 ноября:

Железнодорожное время ... Система Дауда никогда не была принята американскими железными дорогами. Вместо этого железные дороги США и Канады внедрили версию, предложенную Уильямом Ф. Алленом, редактором «Официального путеводителя путешественника». Границы его часовых поясов проходили через железнодорожные станции, часто в крупных городах. Например, граница между его восточными и центральными часовыми поясами проходила через Детройт, Буффало, Питтсбург, Атланту и Чарльстон. Он был открыт в воскресенье, 18 ноября 1883 года , также называемый «День двух полудней» , когда часы на каждой железнодорожной станции были сброшены, так как полдень стандартного времени был достигнут в каждом часовом поясе. Зоны были названы межколониальными, восточными, центральными, горными и тихоокеанскими. ...
...
Хронометраж на американских железных дорогах в середине 19 века был несколько запутанным. Каждая железная дорога использовала свое собственное стандартное время, обычно основанное на местном времени ее штаб-квартиры или наиболее важного конечного пункта, а расписания поездов железной дороги публиковались с использованием своего собственного времени. Некоторые узлы, обслуживаемые несколькими железными дорогами, имели часы для каждой железной дороги, каждый из которых показывал свое время.

Также обратите внимание, что это не относится к Postgresql. Это справедливо для любого программного обеспечения или операционной системы, которая использует базу данных tzdata (хотя, конечно, многие будут ограничены датами после 1970 или после 1901 года, поэтому 1883 недостижим, но есть много, много других изменений повсюду в разные времена).

jcaron
источник