Montando um calendário de maio de 2005 do zero
Precisei de um calendário específico para maio de 2005 recentemente para um projeto de migração de dados antigos. O problema é que muitas bibliotecas modernas simplesmente assumem o padrão gregoriano completo e não tratam bem datas antigas com as particularidades de cada país. Aqui vai o passo a passo real do que eu fiz, sem enrolação.
O que você precisa saber antes de começar sobre o calendario de maio de 2005
Maio de 2005 começou numa segunda-feira e terminou numa quarta-feira, com 31 dias no total. Se você for gerar isso programaticamente, precisa considerar que o dia 1º caiu numa segunda, o que determina toda a estrutura da grade. No Brasil, os feriados daquele mês eram: Dia da Moda (1º de maio, feriado nacional), Dia do Trabalhador — que também é 1º de maio, então não tem feriado extra nesse mês, e a Páscoa tinha caído em março, então não influencia maio. Para Portugal, o cenário é diferente: o feriado municipal pode variar conforme a cidade. Eu usei Python com a biblioteca datetime padrão e escrevi uma função simples. Não precisei de nada externo. O código abaixo gera a grade completa:
👉 Clique no botão abaixo para saber mais sobre o assunto!
import datetime
ano = 2005
mes = 5
primeiro_dia = datetime.date(ano, mes, 1)
ultimo_dia = datetime.date(ano, mes, 28) + datetime.timedelta(days=datetime.date(ano, mes + 1, 1).day - 1)
dias_semana = ['Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb', 'Dom']
print(' | '.join(dias_semana))
calendario = []
for dia in range(1, ultimo_dia.day + 1):
d = datetime.date(ano, mes, dia)
calendario.append(f'{dia:2d}')
preenche espaços vazios antes do primeiro dia
offset = primeiro_dia.weekday()
linha = [' '] * offset + calendario[:7 - offset]
for i in range(offset, len(calendario), 7):
print(' | '.join(calendario[i:i+7]))
A saída fica alinhada em colunas de sete dias. Se você precisar exportar para CSV ou Excel, basta trocar o print por writerow. Eu fiz essa conversão num script de meia hora e exportei para uma planilha que minha equipe usava para cross-check de relatórios financeiros.
Problema real que eu encontrei e como resolvi
O bug mais chato que tive foi com o cálculo do último dia do mês. Se você usa datetime.date(2005, 5, 31) funciona, mas ao tentar ir para junho somando dias, o Python lança exceção se você passar 32. A solução foi usar o seguinte truque: criar a data do primeiro dia do mês seguinte e subtrair um dia. Funciona para qualquer mês, inclusive fevereiro de anos bissextos. Outro detalhe que quase me custou duas horas de debugging: a zona horária. Meu servidor estava em UTC e os dados de entrada vinham de arquivos locais com fuso horário brasileiro (UTC-3). Quando eu convertia as datas diretamente, os dias acabavam deslocados em um. A correção foi explícita: usar pytz ou zoneinfo para fixar o fuso antes de qualquer operação.
Alternativas e quando não usar isso
Se você precisa de algo só para exibição visual, uma imagem ou PDF pronto já existe por aí. Mas se o objetivo é integração com sistemas, bancos de dados ou geração automática, fazer manual é a única forma de garantir precisão. Frameworks como dateutil ajudam, mas introduzem dependências que às vezes causam problemas em ambientes restritos. O calendário de maio de 2005 em si não tem nada de especial fora do óbvio, mas os detalhes técnicos de como gerá-lo corretamente são o que fazem a diferença na prática. Se você estiver montando algo maior que envolva múltiplos meses e anos, considere criar uma função reutilizável logo no início. Economiza muito tempo depois.