Dlaczego strefa czasowa ma tak szalone przesunięcie względem UTC w roku 0001 w Postgres?

16

W Postgres 9.5 byłem zaskoczony widząc wynik widoczny poniżej podczas eksperymentowania z rokiem 0001(bez roku zero 0000).

Przesunięcie -07:52:58?

Niektóre przykładowy kod. Zauważ, że użyłem mieszanego TIMESTAMP WITH TIME ZONEi TIMESTAMP WITHOUT TIME ZONE, więc przeczytaj uważnie.

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")

Jestem zaskoczony tej drugiej wartości: 0001-12-31 16:07:02-07:52:58 BC. Rozumiem, że musimy cofnąć się o osiem godzin wstecz, podobnie jak America/Los_Angelesosiem godzin za UTC, z przesunięciem o -08:00. Ale zamiast -08:00przesunięcia jest -07:52:58. Dlaczego?

Bez problemu pod UTC

Nie ma takiego problemu przy wprowadzaniu danych w 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")

Bez roku zerowego

Nawiasem mówiąc, część daty wydaje się być poprawna. Wydaje się, że nie ma roku 0000, który byłby punktem zwrotnym między epokami „BC” i „AD”. Weź pierwszą chwilę roku 0001, odejmij godzinę, a dostaniesz rok 0001 BC- więc nie ma roku zero.

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_ ;

Rezultatem jest rok 0001 BC, więc przeskakujemy od 0001do 0001 BC; nie ma roku zero 0000.

"0001-12-31 23:00:00+00 BC"
Basil Bourque
źródło
Również świetny film o szaleństwie stref czasowych
billinkc
Punktem zwrotnym między BC a AD jest rok 1. Jest to rok 1 lub rok -1. Tak po prostu nazywają się lata. Rok 0 nie istnieje (a raczej jest niezdefiniowany, ponieważ jest to raczej problem z definicją niż egzystencjalny).
slebetman
Pamiętasz, jak to było podczas obchodów 2000 r., Kiedy niektórzy pedantyczni ludzie mówili, że drugie tysiąclecie technicznie rozpoczyna się w 2001 r., A nie 2000? Dlatego. Lata zaczynają się od 1, a nie 0. A rok przed rokiem 1 jest rokiem 1 pne (tj. Rok -1)
slebetman
1
@slebetman, który zależy od używanego kalendarza. Proleptyczny gregoriański ma zarówno formę, która używa 0 jako rok przed 1 CE, jak i formę, która umieszcza 1 BCE bezpośrednio przed 1 CE (ISO 8601 popiera oba w posiadaniu 0000jako prawidłowej wartości roku, ale nie nalega na to, czy jest ona używana, czy nie ). To prawda, że ​​PostgreSQL używa formularza bez roku 0, ale nie można powiedzieć „lata zaczynają się od 1, a nie 0”, jakby to był jakiś uniwersalny fakt. Łatwo jest między nimi tłumaczyć np. Dane astronomiczne. (Trzecie tysiąclecie nadal zaczynało się w 2001 r. W obu kierunkach, ponieważ pozostało trzecie tysiąclecie od 1 roku n.e.)
Jon Hanna
@JonHanna: Nikt nie używał w tym czasie żadnej formy gregoriańskiego kalendarza proleptycznego, więc myślę, że należy tutaj uprzywilejować kalendarz juliański - który nie ma roku zerowego.
Kevin

Odpowiedzi:

22

18 listopada 1883 roku o godzinie 12:00 (nowy czas) amerykańskie koleje przyjęły standardowy czas.

Oznacza to, że przed tym czasem Los Angeles wykorzystywał rzeczywisty czas lokalny na podstawie średniego czasu słonecznego. Następnie przeniesiono go do lokalnej strefy czasowej, która, stanowiąc całkowite przesunięcie godzin w stosunku do czasu Greenwich, nieznacznie różniła się od poprzedniego czasu.

Chcieć wiedzieć więcej?

  • Pobierz bazę danych stref czasowych tzdata z IANA: Strefy czasowe .

  • Wewnątrz znajdują się definicje (wielu) stref czasowych, które mają wiele odmian w czasie, a także mnóstwo komentarzy opisujących, jakie zmiany zostały wprowadzone i kiedy. To zabawne czytanie!

  • Wikipedia ma również kilka interesujących faktów na stronie Wikipedia: Strefa czasowa , dotycząca zmiany 1883, 18 listopada:

Czas na kolei
...
Pomiar czasu na amerykańskich kolejach w połowie XIX wieku był nieco zagmatwany. Każda linia kolejowa używała własnego standardowego czasu, zwykle opartego na czasie lokalnym w swojej siedzibie lub najważniejszym terminalu, a rozkłady pociągów były publikowane według własnego czasu. Niektóre skrzyżowania obsługiwane przez kilka linii kolejowych miały zegar dla każdej linii kolejowej, z których każda pokazywała inny czas.
... System Dowda nigdy nie został zaakceptowany przez amerykańskie koleje. Zamiast tego amerykańskie i kanadyjskie linie kolejowe wdrożyły wersję zaproponowaną przez Williama F. Allena, redaktora Oficjalnego Przewodnika Kolejowego Podróżnika. Granice stref czasowych przebiegały przez stacje kolejowe, często w dużych miastach. Na przykład granica między wschodnimi i środkowymi strefami czasowymi przebiegała przez Detroit, Buffalo, Pittsburgh, Atlantę i Charleston. Został zainaugurowany w niedzielę, 18 listopada 1883 r. , Zwany także „Dniem Dwóch Południa” , kiedy zegar każdej stacji kolejowej został zresetowany, ponieważ w każdej strefie czasowej osiągnięto standardowe południe. Strefy nazwano Interkolonialnymi, Wschodnimi, Środkowymi, Górskimi i Pacyfikiem. ...

Pamiętaj również, że nie dotyczy to Postgresql. Dotyczy to dowolnego oprogramowania lub systemu operacyjnego, który korzysta z bazy danych tzdata (choć oczywiście wiele będzie ograniczonych do dat po 1970 lub 1901, więc 1883 jest poza zasięgiem, ale istnieje wiele, wiele innych korekt w całym miejscu w Inne czasy).

Jcaron
źródło