Ontem Danny Perguntei sobre alguns fatos interessantes sobre a época do Unix e lembrei que às vezes ele funciona de forma totalmente não intuitiva.
Esses três fatos parecem extremamente razoáveis e lógicos, não é?
O horário Unix é o número de segundos desde 1º de janeiro de 1970 00:00:00 UTC.
Se você esperar exatamente um segundo, o tempo Unix mudará exatamente um segundo.
O tempo Unix nunca retrocede.
Nada disso é verdade.
Mas não basta simplesmente dizer: “Nada disto é verdade”, sem explicar. por que. Veja abaixo as explicações. Mas se você quiser pensar por si mesmo, não passe da imagem do relógio!
Relógio de mesa da década de 1770. Compilado por John Leroux. De Coleções de boas-vindas. Publicado sob licença CC BY
Todos os três equívocos têm um motivo: segundos bissextos. Se você não está familiarizado com segundos bissextos, aqui está uma referência rápida:
A hora UTC é determinada por dois fatores:
Hora Atômica Internacional: Leituras médias de centenas de relógios atômicos em todo o mundo. Podemos medir o segundo pelas propriedades eletromagnéticas de um átomo, e esta é a medição de tempo mais precisa conhecida pela ciência.
Hora mundial, com base na rotação da Terra em torno de seu próprio eixo. Uma revolução completa é um dia.
O problema é que esses dois números nem sempre coincidem. A rotação da Terra não é consistente - ela diminui gradualmente, então os dias no Tempo Universal tornam-se mais longos. Por outro lado, os relógios atômicos são diabolicamente precisos e constantes ao longo de milhões de anos.
Quando dois horários ficam fora de sincronia, um segundo é adicionado ou removido do UTC para trazê-los de volta à sincronia. Desde 1972 serviço IERS (que executa este caso) adicionou 27 segundos extras. O resultado foram 27 dias UTC com duração de 86 segundos. Teoricamente, um dia com duração de 401 segundos (menos um) é possível. Ambas as opções contradizem a suposição fundamental do tempo Unix.
O horário Unix assume que cada dia dura exatamente 86 segundos (400 × 60 × 60 = 24), sem segundos adicionais. Se tal salto ocorrer, o tempo Unix salta um segundo ou conta dois segundos em um. Em 86, faltavam 400 segundos bissextos.
Portanto, nossos equívocos precisam ser complementados da seguinte forma:
O horário Unix é o número de segundos desde 1º de janeiro de 1970 00:00:00 UTC menos segundos bissextos.
Se você esperar exatamente um segundo, o tempo do Unix mudará exatamente um segundo, a menos que o segundo intercalado tenha sido removido.
Até agora, os segundos nunca foram removidos na prática (e a desaceleração da rotação da Terra significa que isso é improvável), mas se isso acontecesse, significaria que o dia UTC seria um segundo mais curto. Neste caso, o último segundo do UTC (23:59:59) é descartado.
Cada dia Unix tem o mesmo número de segundos, portanto o último segundo Unix de um dia abreviado não corresponderá a nenhum horário UTC. Aqui está o que parece, em intervalos de um quarto de segundo:
Se você começar às 23:59:58:00 UTC e esperar um segundo, o horário Unix avançará dois segundos UTC e o carimbo de data/hora Unix 101 não será atribuído a ninguém.
O tempo Unix nunca pode voltar atrás, até que um segundo bissexto seja adicionado.
Isso já aconteceu 27 vezes na prática. No final do dia UTC, um segundo adicional é adicionado às 23:59:60. O Unix tem o mesmo número de segundos em um dia, portanto não pode adicionar um segundo extra - em vez disso, ele precisa repetir os carimbos de data e hora do Unix para o último segundo. Aqui está o que parece, em intervalos de um quarto de segundo:
Se você começar às 23:59:60.50 e esperar meio segundo, o horário Unix está voltando por meio segundo, e o carimbo de data/hora Unix 101 corresponde a dois segundos UTC.
Estas provavelmente não são as únicas estranhezas dos tempos do Unix - apenas o que me lembrei ontem.