Aprum

O erro de fuso horário em app que muda a data sozinho

· 5 min de leitura

Às 21:56 do dia 18, uma função devolvia 19/08 e o banco devolvia 18/08. Seis módulos achavam que já era outro dia: 3 horas por dia, 12,5%.

Duas partes do mesmo aplicativo, medidas no mesmo segundo, discordavam sobre que dia era. Uma dizia dia 19. A outra dizia dia 18. Nenhuma das duas estava mentindo de propósito: as duas estavam calculando a data certa, cada uma no fuso horário errado para a outra.

Erro de fuso não é um bug exótico. É o tipo de falha mais comum em qualquer sistema que mistura hora do servidor, hora do usuário e hora gravada no banco de dados, sem padronizar as três.

O caso: 21:56 do dia 18, e duas respostas diferentes para "que dia é hoje"

Numa medição feita às 21:56 do dia 18, uma função do aplicativo, ao ser perguntada a data atual, devolvia 2026-08-19. No mesmo instante, uma consulta direta ao banco de dados, para a mesma pergunta, devolvia 2026-08-18.

A causa: a função calculava a data em UTC, o fuso de referência usado internamente por boa parte da infraestrutura de nuvem, sem converter de volta para o fuso local antes de apresentar o resultado. Às 21:56 no horário de Brasília, já passa da meia-noite em UTC, e por isso a função "via" o dia seguinte antes da hora, do ponto de vista de quem está no Brasil.

O mecanismo: três horas por dia inteiras no fuso errado

O horário de Brasília fica três horas atrás do UTC. Isso significa que, todos os dias, existe uma janela de exatamente três horas, entre 21h e a meia-noite local, em que o relógio UTC já marca o dia seguinte, enquanto o relógio local ainda marca o dia de hoje.

Três horas por dia, sobre vinte e quatro horas, equivalem a 12,5% do tempo. Não é uma falha rara, de fim de ano ou de virada de mês. É uma janela que se repete todo santo dia, em qualquer sistema que compare data local com data UTC sem converter primeiro.

Na investigação desse caso, seis módulos diferentes do mesmo aplicativo apresentavam o sintoma, cada um em um contexto diferente: um mostrava fatura como vencida um dia antes da hora, outro classificava um lançamento de fim de noite no dia seguinte ao real, outro calculava média mensal contando um dia a mais ou a menos, dependendo da hora exata em que o cálculo rodava.

Por que a fatura aparecia vencida sem estar vencida

O sintoma mais visível para quem usa era uma fatura que vence hoje aparecer marcada como vencida, ainda dentro do próprio dia do vencimento, sempre depois das 21h. A lógica de "está vencido" comparava a data de vencimento, gravada em UTC, contra o horário atual também em UTC, sem levar em conta que o usuário, no fuso local, ainda tinha quase três horas de prazo restante.

Esse tipo de falha é particularmente enganoso porque acontece só numa fatia do dia. Uma pessoa que conferisse a mesma fatura de manhã veria "em dia". A mesma pessoa, conferindo à noite, veria "vencida", sem que nada tivesse mudado de fato entre as duas checagens.

Esse mesmo padrão, um número correto lido no momento errado, tem uma versão sem relação com fuso horário em app de finanças mostrando dado antigo, onde o problema era o tempo verbal da frase, não o fuso do relógio.

Por que corrigir isso não é só trocar um número

Diferente de um erro de cálculo isolado, um problema de fuso horário costuma estar espalhado por várias partes do sistema, porque cada módulo que lida com data, de forma independente, pode ter cometido a mesma escolha de comparar horários em fusos diferentes sem converter. Corrigir um módulo não corrige os outros cinco, e é por isso que uma auditoria séria desse tipo de falha precisa varrer todo lugar do sistema que lê ou grava data, não só o ponto onde o sintoma apareceu primeiro.

O problema se multiplica com múltiplos servidores

Um sistema que roda em mais de um servidor, cada um fisicamente localizado numa região diferente, corre o risco de misturar ainda mais fusos horários dentro do mesmo processo. Se um servidor grava a hora local da própria máquina, e outro grava a hora em UTC, e um terceiro grava a hora do fuso do usuário, uma mesma operação pode carregar três representações de tempo diferentes, sem nenhuma delas convertida para uma referência comum. A prática mais segura, adotada depois da correção deste caso, foi gravar tudo em UTC internamente, e converter só no momento de mostrar a informação para quem está usando o aplicativo, nunca antes disso. Essa mesma ideia, duas partes do sistema discordando sobre o mesmo fato, aparece também em saldo desatualizado no app do banco, com outra causa, mas o mesmo tipo de sintoma.

Como conferir na sua conta

  1. Se algo no aplicativo parecer vencido, atrasado ou datado de forma estranha, anote o

horário exato em que você está olhando, não só a data.

  1. Repita a checagem do mesmo item de manhã, antes das 21h no horário local.
  2. Se o status mudar entre a checagem da noite e a checagem da manhã seguinte, sem

nenhuma ação sua no meio, é sinal de comparação de data feita no fuso errado.

  1. Ao reportar, inclua o horário exato da checagem, não só "hoje": um problema que só

aparece depois das 21h é muito mais fácil de reproduzir com essa informação.

  1. Para valores que dependem de fechamento de dia (saldo do dia, gasto do dia), evite

tirar conclusão de checagens feitas na janela das três horas antes da meia-noite, até que o comportamento esteja confirmado como correto.

O resumo em quatro linhas

18, no mesmo instante.

três horas por dia, todo dia.

outro dia.

de manhã.

Veja isso na sua conta

O Aprum conecta suas instituições por Open Finance e separa o que foi provado do que ainda não foi. Ele não move dinheiro, e não recomenda ativo.

Conhecer o Aprum

Leia também