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 ZONE
i 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_Angeles
osiem godzin za UTC, z przesunięciem o -08:00
. Ale zamiast -08:00
przesunię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 0001
do 0001 BC
; nie ma roku zero 0000
.
"0001-12-31 23:00:00+00 BC"
źródło
0000
jako 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.)Odpowiedzi:
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:
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).
źródło