Quando você pede a um modelo de linguagem para converter o horário de uma reunião internacional, calcular o prazo de entrega de um pedido ou montar a agenda de um evento, a resposta em texto pode parecer perfeita e estar errada por horas. O modelo raramente sabe que fuso horário está usando por padrão, ignora que o Brasil aboliu o horário de verão em 2019 e às vezes mistura a data do próprio sistema com a data que você pediu. Avaliar esse comportamento não é ler a resposta e achar boa: é montar casos de teste com datas brasileiras conhecidas, obrigar o modelo a declarar o fuso em que está respondendo e conferir o resultado com código, no fuso correto, em vez de confiar no texto.
Este guia mostra o problema, um conjunto de testes com casos de BRT (UTC-3) contra CET (Europa), a redação de prompt que força o modelo a explicitar a conversão, e a validação em Python com a biblioteca padrão zoneinfo. A regra de ouro: para data e hora, texto gerado não é evidência. Só o cálculo determinístico é.
Resumo rápido
- LLMs não têm fuso horário fixo: o mesmo prompt pode dar respostas diferentes conforme a data do sistema ou a hora do pedido.
- O Brasil não tem mais horário de verão desde o Decreto 9.772/2019; Brasília é UTC-3 o ano inteiro. Modelos com dados antigos podem aplicar DST inexistente.
- Monte um conjunto de testes com casos brasileiros: BRT (UTC-3) contra CET (UTC+1/+2), virada de dia e meia-noite.
- O prompt deve exigir que o modelo declare o fuso de entrada, o fuso de saída e o horário no formato ISO 8601 com offset.
- Valide com Python
zoneinfoedatetime: compare resposta do modelo com cálculo do fuso oficial IANA.- Trate “meia-noite de terça” e “virada de dia” como casos obrigatórios: são onde mais erros aparecem.
Por que modelos de linguagem erram fuso horário
Um modelo de linguagem gera texto baseado em padrões estatísticos. Ele não executa um relógio interno nem consulta a base de fusos IANA (a lista oficial de regras de fuso, mantida pela entidade IANA) a cada resposta. Sem instrução explícita, ele assume o que aprendeu no treinamento, ou o que o contexto do sistema informa como “hoje”.
Três falhas se repetem:
1. O fuso padrão suposto
Muitos sistemas injetam a data e hora atuais em UTC (o fuso de referência mundial, tempo coordenado) ou no fuso do servidor. Se o sistema roda em UTC e você pede “horário de Brasília”, o modelo pode simplesmente repetir o valor em UTC sem converter, entregando uma hora adiantada em três em relação ao relógio de Brasília.
2. Horário de verão que não existe mais
O Brasil encerrou o horário de verão em todo o território nacional pelo Decreto 9.772, de 25 de abril de 2019. Modelos treinados com dados anteriores podem “lembrar” que em janeiro o Sudeste ficava UTC-2 e devolver uma hora errada. Como Brasília é UTC-3 o ano inteiro, esse erro some da resposta de quem valida com código, mas engana quem só lê o texto.
3. Confusão entre data local e data do sistema
Se você escreve “marque para terça às 23h” e o contexto do sistema diz que “hoje é quarta”, o modelo pode escolher a terça da próxima semana ou a terça passada sem explicar o critério. Sem âncora de data explícita, a resposta é indeterminada.
O que você consegue confirmar em fonte primária
Antes de testar, separe o que é fato verificável do que é suposição. O que dá para confirmar hoje:
- Brasília usa o fuso
America/Sao_Paulo, UTC-3, sem horário de verão desde 2019 (Decreto 9.772/2019). - A biblioteca padrão do Python traz
zoneinfo(disponível desde a versão 3.9) para trabalhar com fusos da base IANA, edatetimecom suporte a objetos cientes de fuso (aware). - A base de fusos é atualizada periodicamente; em ambientes sem os dados do sistema, o pacote tzdata fornece a base via pip.
O que você não deve afirmar sem testar: o fuso exato que uma versão específica de cada API usa por padrão, ou se ela injeta data automaticamente. Esse comportamento muda entre provedores e versões. A forma segura de tratar isso é sempre informar a data e o fuso no prompt e sempre validar o resultado fora do modelo.
Como montar o conjunto de testes com casos brasileiros
Um bom conjunto de avaliação de fuso tem casos com resposta que você já sabe de antemão. Nada de “parece certo”. A tabela abaixo mostra uma matriz de casos que cobre os erros mais comuns.
| Caso | Entrada (prompt) | Resposta esperada (verificada em código) | Erro que revela |
|---|---|---|---|
| BRT simples | Reunião às 14h em Brasília, qual horário em Lisboa? | 14:00 BRT = 17:00 ou 18:00 WEST/WET conforme o período do ano | Suposição de UTC puro |
| Virada de dia | Reunião às 22h em Brasília com Tóquio (+9), que dia é lá? | Dia seguinte, 10:00 JST | Troca de dia ignorada |
| Fim de horário de verão | Em 1º de fevereiro, qual o offset de Brasília? | UTC-3 (sem DST desde 2019) | Aplicar DST extinto |
| Meia-noite | Entrega prevista 00:00 de Brasília, data em UTC? | 03:00 UTC do mesmo dia civil brasileiro | Ambiguidade de meia-noite |
| Data de sistema vs pedido | “Hoje” + prazo de 2 dias | Depende da data-âncora declarada | Usar data do servidor |
Passo a passo do conjunto de testes
- Escolha de 8 a 12 casos com data e hora fixas, sempre em datas passadas ou próximas conhecidas.
- Para cada caso, calcule a resposta correta com
zoneinfoantes de rodar o modelo. Esse é o gabarito. - Rode o mesmo prompt em cada modelo avaliado, sem alterar o texto.
- Guarde a saída bruta do modelo junto com o gabarito.
- Extraia a data e hora da resposta (idealmente exigindo formato ISO 8601) e compare programaticamente.
- Registre a taxa de acerto por categoria de erro, não só o total.
Como escrever o prompt para obrigar o modelo a declarar o fuso
O prompt de avaliação precisa tirar a ambiguidade de cima da mesa. As três exigências que mais reduzem erro:
Você é um conversor de fusos horários. Resolva o problema abaixo seguindo
estas regras, sem exceção:
1. Declare o fuso de entrada (ex.: America/Sao_Paulo, UTC-3).
2. Declare o fuso de saída (nome IANA e offset).
3. Responda o horário convertido no formato ISO 8601 com offset,
por exemplo 2026-03-10T17:00:00-03:00.
4. Se cair em outro dia civil, escreva "MUDA DE DIA: sim/nao".
5. Se tiver dúvida sobre horário de verão, use a regra atual do Brasil
(sem DST desde 2019) e diga isso explicitamente.
Data-âncora: 10 de marco de 2026, em Brasília.
Pergunta: reuniao com equipe em Berlim as 17:00 no horario de Brasilia.
Qual o horario em Berlim, no formato ISO 8601 com offset?
O ponto do MUDA DE DIA: sim/nao é forçar o modelo a pensar sobre a virada do dia, que é onde mais erro aparece. Exigir o nome IANA além do offset obriga o modelo a “comprometer-se” com um identificador verificável, o que também ajuda a depurar quando ele erra.
Para prompts longos com muitos casos, vale revisar a estrutura em engenharia de prompts avançada e testar variações de instrução de sistema.
Validar com código em vez de confiar no texto
A parte que separa avaliação séria de impressão pessoal é o gabarito computado. Com a biblioteca padrão do Python, você calcula o resultado correto e compara. Exemplo que cobre o caso de Brasília contra Berlim com a regra atual de fusos:
from datetime import datetime
from zoneinfo import ZoneInfo
# Horario declarado em Brasilia
brt = ZoneInfo("America/Sao_Paulo")
berlim = ZoneInfo("Europe/Berlin")
entrada = datetime(2026, 3, 10, 17, 0, tzinfo=brt)
saida = entrada.astimezone(berlim)
print(entrada.isoformat()) # 2026-03-10T17:00:00-03:00
print(saida.isoformat()) # horario equivalente em Berlim
print("mesmo dia civil:", entrada.date() == saida.date())
O método astimezone aplica as regras da base IANA, incluindo as mudanças de horário de verão europeu (CET/CEST), que o Brasil não segue mais. O resultado do código é a fonte de verdade. Se o modelo devolver um offset diferente, o modelo errou, ponto.
Fluxo de validação automática
- Defina o gabarito com
zoneinfopara cada caso. - Extraia a string ISO 8601 da resposta do modelo com expressão regular.
- Converta para
datetimecomdatetime.fromisoformat. - Compare os instantes absolutos (o momento no tempo), não apenas o texto.
- Some os acertos por categoria e gere a taxa de erro por tipo (virada de dia, DST, offset puro).
Esse tipo de teste programático se integra bem a pipelines maiores. Se você já monta avaliações de qualidade, vale encaixar aqui o mesmo cuidado que você usa em como testar agente de IA e em redução de alucinação.
Exemplo: agenda de evento em Porto Alegre com palestrante em Berlim
Uma pequena agência de eventos em Porto Alegre organiza um webinar com um palestrante baseado em Berlim. A equipe brasileira escreve para o assistente: “confirme a agenda de quinta às 18h, horário de Brasília, com o convidado na Alemanha”. O assistente de IA responde com a data e hora apenas no horário local brasileiro, sem dizer a que fuso se refere nem qual seria o horário do palestrante.
Ao aplicar o protocolo deste guia, a agência exige que o assistente declare o fuso IANA, use ISO 8601 com offset e sinalize se o dia civil muda. Para o caso de Porto Alegre (que, como Brasília, está em UTC-3 sem horário de verão), o horário de referência e o de Berlim são calculados com zoneinfo e conferidos antes de qualquer convite ser enviado. O ganho não é “a IA acertar sempre”, e sim ter um gabarito que mostra quando ela erra e onde. Os números de resultado variam por modelo e por versão, então o caminho correto é medir no seu próprio conjunto, não confiar em um caso isolado.
Erros comuns
- Confiar no texto sem calcular. Uma resposta fluente pode esconder uma hora de erro. Sempre gere o gabarito em código.
- Não exigir o fuso na resposta. Se o modelo não diz de qual fuso está falando, você não consegue validar nada.
- Assumir que o modelo sabe a data de “hoje”. Sem data-âncora explícita no prompt, o resultado é indeterminado.
- Deixar o modelo aplicar horário de verão brasileiro. Não existe desde 2019; forcê-lo à regra atual evita erro de uma hora.
- Testar só o caso fácil. Casos de virada de dia e meia-noite expõem a maioria dos erros.
- Comparar texto em vez de instantes. “17h” e “17:00:00-03:00” dizem coisas diferentes; compare o momento no tempo.
Perguntas frequentes
O modelo de linguagem tem um fuso horário fixo?
Não de forma confiável. Ele pode receber a data e hora do sistema como contexto, ou assumir valores aprendidos no treinamento. Por isso a única forma robusta é informar a data-âncora e o fuso no prompt e validar o resultado fora do modelo.
Por que o modelo aplica horário de verão que o Brasil não tem mais?
Porque parte dos dados de treinamento é anterior a 2019, quando o horário de verão existia. O Decreto 9.772/2019 encerrou essa prática, e a regra atual é UTC-3 o ano inteiro para Brasília.
Qual biblioteca usar para o gabarito de fusos?
A biblioteca padrão do Python, com zoneinfo (Python 3.9 ou superior) e datetime. Ela usa a base oficial IANA e evita pacotes de terceiros para o cálculo básico.
Meu servidor roda em UTC. Isso importa?
Importa. Se a data do sistema for injetada em UTC e você não declarar o fuso desejado, o modelo pode responder em UTC. Sempre diga “em horário de Brasília” (UTC-3) e exija o offset na resposta.
Quantos casos de teste são suficientes?
Para uma avaliação inicial, de 8 a 12 casos bem escolhidos cobrindo BRT simples, virada de dia, meia-noite e comparação com um fuso europeu já mostram o comportamento. Amplie conforme o uso real do seu produto.
Posso usar o próprio modelo para gerar o gabarito?
Não. O gabarito precisa ser independente e determinístico. Use zoneinfo para calcular e só depois compare com a saída do modelo.
Fontes e leitura recomendada
- Python: documentação de
zoneinfo - Python: documentação de
datetime - Decreto 9.772/2019 (encerra a hora de verão no Brasil)
- IANA: base de dados de fusos horários
- PyPI: pacote tzdata
- Anthropic: uso de system prompts
- Google: system instructions na API Gemini
Para complementar, veja no site como a janela de contexto afeta a coerência de respostas em janela de contexto em IA e como custos de chamadas se comportam em tokens e custo de API quando você roda conjuntos grandes de teste.