In Postgres 9.5 war ich überrascht, das unten gezeigte Ergebnis zu sehen, während ich mit dem Jahr 0001
(ohne Jahr Null 0000
) experimentierte .
Offset von -07:52:58
?
Ein Beispielcode. Beachten Sie, dass ich gemischte Verwendung von TIMESTAMP WITH TIME ZONE
und TIMESTAMP WITHOUT TIME ZONE
, also lesen Sie sorgfältig.
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")
Ich bin von diesem zweiten Wert überrascht: 0001-12-31 16:07:02-07:52:58 BC
. Ich verstehe, dass wir acht Stunden zurückgehen müssen, da wir America/Los_Angeles
acht Stunden hinter UTC mit einem Offset von liegen -08:00
. Aber stattdessen ist -08:00
der Versatz -07:52:58
. Warum?
Kein Problem unter UTC
Kein solches Problem bei der Eingabe von Daten unter 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")
Kein Jahr Null
Übrigens scheint der Datumsanteil korrekt zu sein. Es scheint, als gäbe es kein Jahr 0000
, da es der Dreh- und Angelpunkt zwischen den Epochen „BC“ und „AD“ ist. Nehmen Sie den ersten Moment des Jahres 0001, subtrahieren Sie eine Stunde und Sie erhalten das Jahr 0001 BC
- also kein Jahr Null.
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_ ;
Das Ergebnis ist das Jahr 0001 BC
, also springen wir von 0001
zu 0001 BC
; kein Jahr Null 0000
.
"0001-12-31 23:00:00+00 BC"
quelle
0000
als gültigen Jahreswert, besteht jedoch nicht darauf, ob er verwendet wird oder nicht) ). Es ist wahr, dass PostgreSQL das Formular ohne Jahr 0 verwendet, aber Sie können nicht "Jahre beginnen eine 1, nicht 0" als eine Art universelle Tatsache angeben. Es ist einfach, zwischen ihnen zu übersetzen, z. B. für astronomische Daten. (Das dritte Jahrtausend begann immer noch in beiden Richtungen im Jahr 2001, da es das dritte Jahrtausend seit dem 1. Jahrhundert nach Christus war.)Antworten:
Am 18. November 1883 um 12:00 Uhr (Neuzeit) wurde die Standardzeit von den amerikanischen Eisenbahnen übernommen.
Dies bedeutet, dass Los Angeles vor dieser Zeit die tatsächliche Ortszeit verwendete, basierend auf der mittleren Sonnenzeit. Danach wurde es in seine lokale Zeitzone verschoben, die sich geringfügig von der vorherigen Zeit unterschied, da sie einen integralen Stundenversatz zur Greenwich Mean Time darstellte.
Möchten Sie mehr wissen?
Laden Sie die tzdata-Zeitzonendatenbank von IANA: Zeitzonen herunter .
Im Inneren finden Sie die Definitionen der (vielen) Zeitzonen, die im Laufe der Zeit viele Variationen aufweisen, sowie viele Kommentare, in denen angegeben ist, welche Änderungen wann und wo vorgenommen wurden. Es ist eine unterhaltsame Lektüre!
Wikipedia hat auch einige interessante Fakten in der Wikipedia: Zeitzonenseite in Bezug auf die Änderung vom 18. November 1883:
Beachten Sie auch, dass dies nicht spezifisch für Postgresql ist. Dies gilt für jede Software oder jedes Betriebssystem, die / das die tzdata-Datenbank verwendet (obwohl natürlich viele auf Daten nach 1970 oder nach 1901 beschränkt sind, so dass 1883 unerreichbar ist, aber es gibt viele, viele andere Anpassungen überall auf der Website andere Zeiten).
quelle