Чому часовий пояс має такий божевільний зсув від UTC на рік 0001 в Постгресі?


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, що є точкою зрізу між епохами "до н.е." та "н. Е." Візьміть перший момент року 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)
слебетман

1
@slebetman, що залежить від використовуваного календаря. Пролептик "Григоріан" має як форму, яка використовує 0, як рік до 1 СЕ, так і форму, що ставить 1 BCE безпосередньо перед 1 CE (ISO 8601 підтримує як наявність 0000дійсного значення року, але не наполягаючи на тому, використовується він чи ні ). Це правда, що PostgreSQL використовує форму без 0 року, але ви не можете констатувати "роки починають 1, а не 0" так, ніби це якийсь універсальний факт. Перекласти між ними просто, наприклад, для астрономічних даних. (Третє тисячоліття все-таки розпочалося так чи інакше в 2001 році, оскільки воно залишилося третім тисячоліттям після 1 року нашої ери)
Джон Ханна

@JonHanna: У той час ніхто фактично не використовував жодної форми пролептичного григоріанського календаря, тому я думаю, що тут справедливо привілейовувати Юліанський календар - якому немає нуля року.
Кевін

Відповіді:


22

18 листопада 1883 року о 12:00 (новий час) американські залізниці прийняли стандартний час.

Це означає, що до цього часу Лос-Анджелес використовував фактичний місцевий час, виходячи із середнього сонячного часу. Після цього його перемістили до місцевого часового поясу, який, будучи невід’ємним зміщенням годин від середнього часу Грінвічу, трохи відрізнявся від попереднього часу.

Хочете дізнатися більше?

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

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

  • У Вікіпедії є також кілька цікавих фактів на сторінці Вікіпедія: Часовий пояс щодо 1883 року, 18 листопада зміни:

Залізничний час
...
Економія часу на американських залізницях в середині 19 століття була дещо заплутана. Кожна залізниця використовувала власний стандартний час, як правило, виходячи з місцевого часу штабу чи найважливішого терміналу, а розклад поїздів залізниць публікувався, використовуючи власний час. Деякі вузли, які обслуговували кілька залізниць, мали годинник для кожної залізниці, кожен із яких демонстрував різний час.
... Система Дауда ніколи не була прийнята американськими залізницями. Натомість американські та канадські залізниці реалізували версію, запропоновану Вільямом Ф. Алленом, редактором Офіційного довідника залізниць Мандрівника. Межі його часових поясів пролягали через залізничні станції, часто у великих містах. Наприклад, кордон між її східним та центральним часовими поясами пролягав через Детройт, Буффало, Пітсбург, Атланта та Чарлстон. Він був відкритий у неділю 18 листопада 1883 року , який також називався "Днем двох полудня" , коли кожен годинник залізничної станції був скинутий, коли до кожного часового поясу було досягнуто стандартного часу полудня. Зони були названі міжколоніальними, східними, центральними, гірськими та тихоокеанськими. ...

Також зауважте, що це не стосується Postgresql. Це справедливо для будь-якого програмного забезпечення або операційної системи, що використовує базу даних tzdata (хоча, звичайно, багато хто буде обмежений датами або після 1970 року, або після 1901 року, тому 1883 рік є поза досяжністю, але все-таки є багато, багато інших коригувань у всіх місцях різні часи).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.