Por que o fuso horário tem um deslocamento tão louco do UTC no ano 0001 no Postgres?

16

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 ZONEe 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_Angelesseja, oito horas atrás do UTC com um deslocamento de -08:00. Mas em vez do -08:00deslocamento é -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 0001para 0001 BC; nenhum ano zero 0000.

"0001-12-31 23:00:00+00 BC"
Basil Bourque
fonte
Além disso, uma multa vídeo sobre a insanidade de fusos horários
billinkc
O ponto de articulação entre BC e AD é o ano 1. É o ano 1 ou o ano -1. É exatamente como os anos são nomeados originalmente. O ano 0 não existe (ou melhor, é indefinido, pois é mais um problema de definição do que existencial).
Slebetman
Lembra-se de quando, durante as celebrações de 2000, quando alguns pedantes disseram que o segundo milênio tecnicamente começa no ano 2001, não no ano 2000? É por isso. Anos começam em 1, não 0. E o ano antes do ano 1 é o ano 1 aC (ie ano -1.)
slebetman
11
@slebetman que depende do calendário em uso. O gregoriano proléptico tem um formulário que usa 0 como o ano anterior a 1 CE e um formulário que coloca 1 AEC imediatamente antes de 1 CE (a ISO 8601 suporta tanto a obtenção de 0000um 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)
Jon Hanna
@ JonHanna: Na verdade, ninguém estava usando nenhuma forma do calendário gregoriano pró-séptico na época, então acho que é justo privilegiar o calendário juliano aqui - que não tem um ano zero.
Kevin

Respostas:

22

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:

Horário das ferrovias
... A
contagem do tempo nas ferrovias americanas em meados do século XIX era um tanto confusa. Cada ferrovia usava seu próprio horário padrão, geralmente com base no horário local de sua sede ou no terminal mais importante, e os horários dos trens eram publicados usando seu próprio horário. Alguns cruzamentos servidos por várias ferrovias tinham um relógio para cada ferrovia, cada um mostrando um horário diferente.
... O sistema de Dowd nunca foi aceito pelas ferrovias americanas. Em vez disso, as ferrovias dos EUA e do Canadá implementaram uma versão proposta por William F. Allen, editor do Guia Ferroviário Oficial do Viajante. As fronteiras de seus fusos horários atravessavam estações ferroviárias, geralmente nas grandes cidades. Por exemplo, a fronteira entre os fusos horários do Leste e do Central percorria Detroit, Buffalo, Pittsburgh, Atlanta e Charleston. Foi inaugurado no domingo, 18 de novembro de 1883 , também chamado de "O Dia dos Dois Noons" , quando cada relógio da estação ferroviária era reiniciado quando o meio-dia era atingido dentro de cada fuso horário. As zonas foram nomeadas Intercolonial, Leste, Central, Montanha e Pacífico. ...

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

jcaron
fonte