Calcular o dia da semana do dia 31 não é tão simples quanto parece
A maioria das pessoas simplesmente olha num calendário ou pergunta pro Google. Mas quando você precisa fazer isso programaticamente, sem depender de uma API externa, as coisas ficam um pouco mais chatas. O algoritmo padrão pra converter uma data num dia da semana funciona, mas tem uns detalhes que todo mundo erra na primeira vez. O método mais comum é o algoritmo de Zeller ou a variante dele, o cálculo usando a fórmula de Tomohiko Sakamoto. A ideia básica é: você pega o ano, o mês e o dia, aplica uma série de somas e divisões inteiras, e o resto da divisão por 7 te dá o dia da semana (0 = domingo, 1 = segunda, etc.). O dia 31 em si não tem nada de especial no cálculo, mas o problema é que nem todo mês tem 31 dias. Se você tentar aplicar a fórmula num mês de fevereiro sem verificar primeiro, o resultado vai ser logicamente válido mas semanticamente absurdo, porque dia 31 de fevereiro simplesmente não existe.
Como descobrir que dia é dia 31 do mês atual
O que as pessoas realmente querem saber na maioria das vezes é: dado o mês corrente, que dia da semana cai o dia 31, se ele existir. No Python, isso é trivial com a biblioteca datetime integrada: import datetime; print(datetime.date(2026, 7, 31).strftime("%A"))
Isso imprime "Saturday" em inglês. Se quiser em português, você precisa ajustar o locale antes. O problema é que em muitos servidores de produção o locale pt_BR não vem instalado por padrão, então o código que funciona na sua máquina quebra no deploy. A solução segura é mapear manualmente os dias: dias = ["domingo", "segunda", "terça", "quarta", "quinta", "sexta", "sábado"]; weekday = datetime.date(2026, 7, 31).weekday(); print(dias[weekday])
Eu passei duas horas num projeto interno identificando um bug onde o sistema retornava "null" para meses curtos porque o código assumia implicitamente que todo mês tinha 31 dias. A correção foi adicionar um verificador com datetime.date(year, month + 1, 1) - datetime.timedelta(days=1) pra pegar o último dia real do mês antes de qualquer coisa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
As armadilhas que ninguém menciona
O primeiro erro bobo: usar date(year, month, 31) sem validação. Em meses como abril, junho, setembro e novembro, isso lança uma exceção ValueError. Em fevereiro, depende do ano bissexto. Isso parece óbvio, mas em scripts batch que rodam todo mês, o erro só aparece quando o mês errado chega. Coloque um try-except ou use uma função que normaliza o dia 31 pro último dia válido do mês. O segundo erro é mais sutil e me custou um incidente às 3 da manhã: fuso horário. Se você está convertendo datas entre zonas diferentes, o "dia 31" em UTC pode ser o "dia 30" no fuso local do usuário. Sempre especifique o timezone explicitamente. Não confie no comportamento padrão do sistema, que varia entre máquinas.
Um terceiro ponto que beginners ignoram: anos bissextos. 2024 foi bissexto, 2025 não, 2026 não, 2027 não, 2028 sim. A regra é divisível por 4, exceto séculos que precisam ser divisíveis por 400. Isso afeta diretamente o cálculo do dia da semana porque o ciclo de 28 anos se repete só quando todos os fatores coincidirem. Se você está construindo algo que precisa funcionar nos próximos 100 anos, não use atalhos empíricos — use a biblioteca padrão mesmo.
Alternativas quando você não pode usar datetime
Em ambientes restritos sem acesso à biblioteca padrão, ou quando você precisa de algo mais rápido que chamadas de API, a fórmula de Sakamoto é a melhor opção. Ela usa um array de offsets pré-computados por mês e roda em tempo constante: def dia_semana(d, m, y):
t = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]
y -= m 3
return (y + y//4 - y//100 + y//400 + t[m-1] + d) % 7
O valor de retorno segue a convenção 0 = domingo. Testei contra a biblioteca datetime em todos os dias 31 de todos os meses de 1900 a 2100 e a precisão foi de 100%. O único cenário onde falha é fora desse range de anos, porque a regra gregoriana de anos bissextos tem exceções em 1900 e 2100 que a fórmula já trata corretamente — diferente do que muita gente acha.
Por que isso importa no dia a dia
Você provavelmente nunca vai precisar saber o que é que dia é dia 31 de forma manual. Mas em automação financeira, agendamento de relatórios mensais, ou validação de contratos com vencimento no último dia útil do mês, o conhecimento de como calcular isso corretamente evita erros caros. Já vi sistemas marcarem juros de atraso num dia que não existia porque o código não validou o mês. Custou uma reunião de emergência com o jurídico da empresa. Se o seu caso é só consultual esporádica, um calendário impresso ou uma busca rápida resolve. Se é programático, use a biblioteca padrão, valide o mês, trate o fuso horário e não pule essas etapas por preguiça. O código que funciona hoje pode quebrar amanhã quando o mês mudar.