Uma hora ou outra, todo programador tem que lidar com fusos horários.
E não tenho nenhum conselho, mas posso dar um aviso.
Posso te dizer porque você não deve nunca lidar com fusos horários se possível.
Vamos imaginar que alguém criou um aplicativo
que permite calcular a quantos segundos algo ocorreu
Você insere a data e a hora e ele te dá o número de segundos
E eles olham e pensam: "Acho que está funcionando bem"
"Mas vamos adicionar uma caixa que te permite selecionar o fuso horário"
Então, comparando o horário atual em Nova York com Londres há cinco dias, é possível solucionar isso
E está bem - o menu te permite escolher o fuso horário anterior ou posterior ao Greenwich
Brilhante.
Cedo ou tarde, após ganhar certa popularidade, eles recebem uma ligação da Austrália.
E a Austrália diz: "Bom dia, senhor"
Não vou tentar imitar o sotaque
Eu não deveria imitar sotaques
A Austrália diz "Olá!"
"A propósito, nós estamos nove horas e meia a frente de Greenwich"
E o programador diz: "Sério?"
"É, nove horas e meia"
"OK, vou adicionar um caso especial para vocês. Não tem problema"
Um pouco depois alguém do Nepal liga.
E eles dizem: "Oi. Estamos 5 horas e 15 minutos à frente de Greenwich"
E o programador diz: "Sério?" "Sim, é assim faz muito tempo. 5 horas e 15 minutos"
Ótimo. Ok. E adicionam uma exceção. E talvez depois olhem
uma lista de fusos horários. A lista canônica que te diz
os fuso horários, e vão ter certeza de que cobriram todos os fusos do mundo.
Então chega o outono.
E recebem uma ligação da Inglaterra.
E a Inglaterra diz: "Com licença. Estamos atrasados uma hora, o que está acontecendo?"
Espera. O relógio acabou de mudar!"
"Tudo bem, nós já resolvemos"
"Fizemos uma nota de quando o horário de verão começa aqui e adicionamos ao programa!"
E a Inglaterra diz: "Não, o horário de verão começa uma semana antes para a gente"
"É diferente de acordo com onde você mora"
"Voltamos ao horário normal uma semana antes de vocês"
E nessa hora
geralmente os programadores vão colocar as mãos na cabeça
e notar no que eles se meteram.
E está bem! Eles adicionam isso
e lidam com o horário de verão de cada país.
Eles olham no arquivo que diz como fazer isso e o copiam.
Então recebem uma ligação do hemisfério sul que diz:
"Nós não voltamos nosso horário no outono, nós avançamos o horário"
"Nossa primavera... é em novembro"
Neste momento, eles contemplam seu veneno de escolha
questionando se deveriam beber antes de continuar...
...e eles programam isso também.
Então recebem uma ligação de Samoa.
Lá na Linha Internacional de Data, no meio do Pacífico.
E Samoa diz: "Olá!"
"Nós pulamos um dia no outro ano"
E o programador diz: "O quê?"
"É, pulamos um dia. Fomos de 29 de dezembro de 2011 para 31 de dezembro"
"Nós trocamos de lado na Linha Internacional de Data, em vez de estar horas atrás de Greenwich...
estamos horas à frente de Greenwich. O que facilita o comercio com a Austrália"
"Pode levar isso em consideração quando calcular quantos dias e segundos se passaram?"
Está bem, tem um arquivo que te diz quando um país mudou de fuso horário.
Acontece que isso é bem frequente.
Mas eles são anunciados bem antes, então se você mantiver o arquivo atualizado
e programar a lógica também, vai dar tudo certo.
Então você olha para trás e nota que durante a Segunda Guerra Mundial,
a Inglaterra teve o horário de verão dobrado.
Entraram no horário de verão e adicionaram mais uma hora.
Então estavam duas hora à frente de Greenwich, apesar... de Greenwich ser lá.
Tudo bem, você lida com isso.
Você notou que eu comecei a falar como se fosse eu ou você?
Porque eu já fiz isso antes e é muito frustrante.
Então você tem certeza de que está inscrito na lista
de quando os países vão mudar de fuso horário - o que aparentemente acontece muitas vezes!
Até mesmo, diversas vezes no ano, graças a mudanças governamentais.
Então esse programador mítico recebe uma ligação da Líbia;
que em 2013, avisando pouco tempo antes, decidiram que não iriam diminuir o fuso.
Com tão pouca antecedência, ninguém conseguiu corrigir seus relógios.
O que fez com que todos os computadores líbios, independente de sistema operacional...
...estivessem errados em uma hora.
Está tudo bem, você leu a notícia e rapidamente programou isso também.
Então você recebe uma ligação do West Bank.
Onde a população israelense está em um fuso diferente da população palestina.
Porque um está de acordo com Israel e o outro não.
Agora você tem duas populações no mesmo lugar em fusos horários diferentes.
E agora eles tem de decidir se estão em um fuso ou outro, dependendo de quem eles são.
E não tem como implementar isso! então...
então você recebe uma ligação de um historiador.
E ele diz: "Certo, estou tentando calcular algumas datas do século XVIII"
"E mudamos do calendário juliano para o calendário gregoriano"
"E não é que perdemos cerca de três semanas...
...é que pulamos dessa data para aquela, ignorando as outras"
"Você pode programar isso, para que o programa funcione para mim?"
Está tudo bem, afinal alguém já te contou quando essas datas foram,
e você pode programar isso na lógica do programa.
Mas agora o programa está realmente longo e complicado
e é uma bagunça de código espaguete que, de alguma forma, funciona
E então você recebe uma ligação de um historiador russo!
E ele diz: "Nós mudamos para o calendário gregoriano apenas no século XX...
e as datas que você pulou mudam dependendo do local...
tem como você lidar com isso também?" Então você recebe uma ligação de um historiador britânico!
E ele diz que até o século XVI, se eu não me engano,
o ano começava dia 25 de março!
Só para explodir sua mente.
Do dia 24 de março de 924
ao dia 25 de março de 925 passou-se apenas um dia.
E você vai de 31 de dezembro de 924, para 1º de janeiro de 924, porque é essa ordem!
É extremamente complicado. ENTÃO...
Você recebe uma ligação de um astrofísico...
que diz: "Aliás, acabamos de ter um segundo adicional!"
E nesse ponto você diz: "... Quê?!"
Um segundo bissexto; porque a Terra não gira em uma velocidade constante.
Ela desacelera e acelera, de acordo com a movimentação das placas tectônicas
e dos campos magnéticos e afins. Então ocasionalmente
a União Astronômica Internacional define se o segundo bissexto é necessário.
Se for, o relógio vai de 23:59:58
para 23:59:59
e ao invés de ir para 00:00:00, como qualquer fuso horário faria,
ele vai para 23:59:60!
E tudo dá errado, porque repentinamente você tem 61 segundos em um minuto!
Então dependendo da implementação...
ou seu relógio fica um segundo atrasado
ou ele repete um segundo.
O meio para você lidar com isso, é utilizar algo chamado "Era Unix".
E o Numberphile, se eu não me engano, já falou disso antes.
lá você tem essa contagem que começou no primeiro segundo de 1970
e aumenta segundo a segundo.
Constantemente. Tique. Taque. Tique.
E isso é ótimo porque o que você deve fazer é pegar qualquer data que receber,
e calcular como Era Unix
e colocar no seu banco de dados.
E assim você lida com segundos bissextos.
SÓ QUE NÃO! Claro que não!
Porque existe o Tempo Universal Coordenado
que inclui segundos bissextos!
Ele repete ocasionalmente e inclui 23:59:60.
E também o tempo astronômico! Que não inclui segundos bissextos
e está constantemente saindo de sincronia com o resto do mundo
porque temos de olhar para as estrelas e criar telescópios para isso!
[Suspiro profundo]
E o que você aprendeu...
O que você aprendeu depois de lidar com fuso horários, é que deve...
...abandonar seu código...
...e não escrever nada que lide com isso.
Olhe para as pessoas que estiveram lá antes de você.
Você olha para as primeiras pessoas que lidaram com isso,
as pessoas que construíram código espaguete,
e agradece por eles terem deixado o código aberto,
e você pega o que eles fizeram, dá os créditos, e coloca no seu programa,
e nunca mais olha para ele.
Porque lá encontra-se a loucura.
A Google tem uma ótima form de tratar os segundos bissextos.
Há um artigo explicativo no blog deles.
Eles fazem algo chamado de "estiramento bissexto".
Porque ter 61 segundos em um minuto,
ou ter de atrasar o relógio em um segundo
pode ser muito, muito ruim para grandes empresas que precisam
estar sincronizadas de forma exata e ter certeza que um bit é armazenado após o outro,
eles essencialmente "esticam" o segundo ao longo do dia.
Eles adiantam o relógio um microssegundo de cada vez.
Tique, taque, tique, ao longo do dia.
E é assim que eles ficam ,as vezes, até meio segundo adiantados,
mas desde que tudo nos servidores esteja meio segundo adiantado.
Isso foi construído para estar fora de sincronia, desde que saiba-se que uma coisa aconteceu antes da outra.
Continuidade é, na verdade, mais importante que precisão temporal.