Qualidade dos dados

Fusos horários de meia hora e de 45 minutos, explicados

A maioria dos desenvolvedores escreve seu primeiro código de tratamento de fusos horários supondo que todo deslocamento é um número inteiro de horas em relação ao UTC. Essa suposição vale para a maioria dos fusos e deixa de valer na primeira vez que chega uma requisição de algum lugar que não a segue. Várias partes do mundo usam deslocamentos de meia hora, e pelo menos uma região usa um deslocamento de 45 minutos, e nenhum desses é um caso extremo no sentido de ser raro ou inválido. É simplesmente assim que esses lugares escolheram ajustar seus relógios em relação ao sol e aos vizinhos.

Um deslocamento de meia hora geralmente reflete a longitude de um país situada entre dois fusos horários padrão de hora cheia, com a decisão de dividir a diferença em vez de arredondar para um dos lados. Um deslocamento de 45 minutos é ainda mais raro e tende a refletir uma posição intermediária semelhante, combinada com a escolha deliberada de se manter distinto de um deslocamento padrão vizinho. Nenhum dos dois é um erro nos dados. Ambos são fusos horários legais legítimos, registrados da mesma forma que qualquer fuso de hora cheia no banco de dados IANA.

O ponto em que isso realmente quebra o software é nos cálculos de data e hora que embutem suposições fixas. Um código que arredonda deslocamentos para a hora mais próxima, que armazena um deslocamento como um número inteiro de horas ou que monta uma lista suspensa de fusos horários usando apenas incrementos de hora inteira e meia hora vai tratar esses fusos incorretamente sem avisar. A falha também costuma ser silenciosa. Os horários ficam errados em quinze ou trinta minutos, em vez de gerar um erro óbvio, o que torna o bug fácil de passar despercebido nos testes e faz com que ele só apareça quando um usuário real da região afetada relata algo errado.

A solução é simples se você a prever desde o início: trabalhe sempre com o deslocamento UTC real retornado para um fuso, expresso com precisão de minutos, em vez de supor ou arredondar para horas. Armazene e compare nomes de fusos em vez de deslocamentos sempre que possível, já que o nome carrega o deslocamento exato atual e histórico sem que você precise embutir nada no código.

Uma consulta de fuso horário que retorna o deslocamento preciso junto com o nome do fuso IANA elimina a adivinhação aqui. Consulte as coordenadas ou o fuso diretamente, em vez de supor o deslocamento de um local apenas pelo país ou pela região, já que os deslocamentos podem variar dentro de um mesmo país e raramente se alinham perfeitamente à hora cheia em todos os lugares.