No Postgres 9.5, fiquei surpreso ao ver o resultado visto abaixo ao experimentar o ano 0001
(sem ano zero 0000
).
Deslocamento de -07:52:58
?
Algum código de exemplo. Note que eu misturei o uso de TIMESTAMP WITH TIME ZONE
e TIMESTAMP WITHOUT TIME ZONE
, portanto, 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 por esse segundo valor: 0001-12-31 16:07:02-07:52:58 BC
. Entendo que devemos retroceder oito horas, ou America/Los_Angeles
seja, oito horas atrás do UTC com um deslocamento de -08:00
. Mas em vez do -08:00
deslocamento é -07:52:58
. Por quê?
Nenhum problema no UTC
Não existe esse problema ao inserir dados no 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")
No Year Zero
A propósito, a parte da data parece estar correta. Parece que não há ano 0000
, sendo esse o ponto de articulação entre as épocas "BC" e "AD". Tome o primeiro momento do ano 0001, subtraia uma hora e você obtém o ano 0001 BC
- portanto, nenhum 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"
fonte
0000
um valor de ano válido, mas não a insistência em se deve ou não ser usado ) É verdade que o PostgreSQL usa o formulário sem o ano 0, mas você não pode declarar "os anos iniciam um 1, não 0" como se fosse algum tipo de fato universal. É fácil traduzir entre eles para, por exemplo, dados astronômicos. (O terceiro milênio ainda começou em 2001, de qualquer maneira, uma vez que permaneceu o terceiro milênio desde 1 EC)Respostas:
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 das horas em relação ao horário médio de Greenwich, era um pouco diferente do horário anterior.
Quer saber mais?
Faça o download do banco de dados de fuso horário tzdata em IANA: Fusos horários .
Por dentro, você encontrará as definições dos (muitos) fusos horários, que apresentam muitas variações ao longo do tempo, além de muitos comentários detalhando quais alterações foram feitas e quando. É uma leitura divertida!
A Wikipedia também possui alguns fatos interessantes, na página Wikipedia: Fuso horário , sobre a alteração de 1883, 18 de novembro:
Observe também que isso não é específico para o Postgresql. Isso é válido para qualquer software ou sistema operacional que use o banco de dados tzdata (embora muitos sejam limitados a datas posteriores a 1970 ou a 1901, portanto, 1883 está além do alcance, mas existem muitos outros ajustes em todo o lugar em tempos diferentes).
fonte