В 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"
источник
0000
действительного значения года, но не настаивает на том, используется ли он или нет). ). Это правда, что PostgreSQL использует форму без года 0, но вы не можете утверждать, что «годы начинаются с 1, а не 0», как если бы это был какой-то универсальный факт. Легко переводить между ними, например, для астрономических данных. (Третье тысячелетие все же началось в 2001 году в любом случае, так как оно оставалось третьим тысячелетием с 1 года н.э.)Ответы:
18 ноября 1883 года в 12:00 (новое время) американские железные дороги приняли стандартное время.
Это означает, что до этого времени Лос-Анджелес использовал фактическое местное время, основанное на среднем солнечном времени. После этого он был перемещен в местный часовой пояс, который, будучи интегральным смещением часов от среднего времени по Гринвичу, немного отличался от предыдущего времени.
Хотите узнать больше?
Загрузите базу данных часовых поясов tzdata из IANA: Часовые пояса .
Внутри вы найдете определения (многих) часовых поясов, которые имеют много вариаций во времени, а также множество комментариев, детализирующих, какие изменения были сделаны и когда. Это занимательное чтение!
В Википедии также есть несколько интересных фактов на странице Википедии: Часовой пояс , относительно изменения 1883 года, 18 ноября:
Также обратите внимание, что это не относится к Postgresql. Это справедливо для любого программного обеспечения или операционной системы, которая использует базу данных tzdata (хотя, конечно, многие будут ограничены датами после 1970 или после 1901 года, поэтому 1883 недостижим, но есть много, много других изменений повсюду в разные времена).
источник