No Postgres 9.5, fiquei surpreso ao ver o resultado visto abaixo enquanto experimentava o ano 0001
(sem ano zero 0000
).
Deslocamento de -07:52:58
?
Algum código de exemplo. Observe que eu misturei o uso de TIMESTAMP WITH TIME ZONE
e TIMESTAMP WITHOUT TIME ZONE
, então leia com atenção.
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")
Estou surpreso com esse segundo valor: 0001-12-31 16:07:02-07:52:58 BC
. Entendo que devemos retroceder oito horas, pois America/Los_Angeles
está oito horas atrás do UTC com um deslocamento de -08:00
. Mas em vez do -08:00
deslocamento é -07:52:58
. Por quê?
Sem problemas sob UTC
Não existe esse problema ao inserir dados em 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")
sem ano zero
A propósito, a parte da data parece estar correta. Parece que não há ano 0000
, sendo esse o ponto pivô entre as eras “BC” e “AD”. Pegue o primeiro momento do ano 0001, subtraia uma hora e você obtém o ano 0001 BC
– portanto, nada de ano 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_ ;
O resultado é o ano 0001 BC
, então saltamos de 0001
para 0001 BC
; nenhum ano zero 0000
.
"0001-12-31 23:00:00+00 BC"
Em 18 de novembro de 1883 às 12:00 (novo horário), o horário padrão foi adotado pelas ferrovias americanas.
Isso significa que, antes dessa hora, Los Angeles usava a hora local real, com base na hora solar média. Depois disso, foi movido para o fuso horário local, que, sendo um deslocamento integral de horas do horário de Greenwich, era ligeiramente diferente do horário anterior.
Quer saber mais?
Baixe o banco de dados de fuso horário tzdata da IANA: Fusos horários .
Dentro, você encontrará as definições dos (muitos) fusos horários, que têm muitas variações ao longo do tempo, junto com muitos comentários detalhando quais mudanças foram feitas e quando. É uma leitura divertida!
A Wikipedia também tem alguns fatos interessantes, na Wikipedia: Página de fuso horário , sobre a mudança de 18 de novembro de 1883:
Observe também que isso não é específico do Postgresql. Isso é válido para qualquer software ou sistema operacional que use o banco de dados tzdata (embora, é claro, muitos sejam limitados a datas posteriores a 1970 ou posteriores a 1901, portanto, 1883 está fora de alcance, mas há muitos, muitos outros ajustes em todo o lugar em tempos diferentes).