POTHIEDU Não Decore a Resposta. Entenda o Caminho

Domingo É Quanto Do Mês

Domingo É Quanto Do Mês

Descobrir qual é o domingo no mês é mais chato do que parece

A gente sempre precisa saber isso de alguma forma. Seja pra marcar reunião, marcar ponto, ou porque o sistema da empresa só aceita datas em formato específico. A solução óbvia é olhar no calendário, mas às vezes você tá num servidor sem interface gráfica, ou precisa automatizar isso num script, ou simplesmente quer entender o raciocínio por trás. O método mais direto que eu uso é o algoritmo de Zeller, adaptado pra dias da semana. A fórmula base funciona assim: você pega o dia, o mês, o ano, e aplica uma série de divisões inteiras que te dão um número de 0 a 6, onde 0 é domingo. Não vou enrolar com a demonstração matemática completa, mas o essencial é que ela lida com meses janeiro e fevereiro como se fossem meses 13 e 14 do ano anterior. Isso mata a exceção que todo mundo esquece. Na prática, eu não decorei a fórmula. Eu tenho uma funçãozinha em Python que rodeia isso há anos:

def proximo_domingo(ano, mes):
    from datetime import date, timedelta
    primeiro = date(ano, mes, 1)
    dias_ate_domingo = (6 - primeiro.weekday()) % 7
    return primeiro + timedelta(days=dias_ate_domingo)
Isso retorna a data do primeiro domingo do mês. Se você quer todos os domingos, basta somar 7 dias repetidamente até passar do último dia do mês. A função calendar.monthrange() do Python te diz quantos dias o mês tem, então o loop fica trivial. O problema que eu encontrei na prática, e que quase me custou um deploy errado num fim de semana, é que domingo é quanto do mês varia dependendo do fuso horário. Se você roda o cálculo no UTC e o negócio roda no Brasília (UTC-3), um domingo em Londres pode ser segunda-feira aqui. A correção é simples: normalize tudo pra um fuso horário específico antes de aplicar a lógica. Eu passei duas horas rastreando um bug desses num sistema de relatórios mensais. O relatório ia pro domingo certo no servidor, mas o usuário via segunda porque o cron job disparava cedo demais no horário local.

Outra coisa que começante costuma errar: assumir que o weekday() do Python começa em domingo. Começa em segunda (0). Domingo é 6. Já vi gente escrever (7 - primeiro.weekday()) % 7 e achar que estava certo, quando na verdade o correto é (6 - primeiro.weekday()) % 7. A diferença é sutil mas cambia o resultado pra todo mês. Se você não tá usando Python, a lógica é a mesma em qualquer linguagem. JavaScript tem getDay() que já retorna 0 pra domingo, o que é mais conveniente. Em SQL, depende do banco — no PostgreSQL o EXTRACT(DOW FROM date) dá 0 pra domingo, no MySQL o DAYOFWEEK() dá 1 pra domingo. Essa inconsistência entre bancos é uma das razões pelas quais eu paramos de confiar em consultas diretas pra esse tipo de coisa e criamos uma view utilitária no esquema comum. Para quem precisa fazer isso de forma recursiva num contexto empresarial, vale a pena embutir essa lógica num serviço ou função reutilizável, não espalhar por várias querys. Meu time teve um período em que cada relatório tinha sua própria implementação meia-boca, e isso gerou discrepâncias entre setores que-reportavam domingos diferentes pro mesmo mês. Levou três semanas pra gente identificar a causa raiz.

Quantos Domingo Tem Um Mês - ZULEDU
Quantos Domingo Tem Um Mês - ZULEDU

O limite dessa abordagem é quando você precisa lidar com calendários religiosos ou feriados móveis que não seguem a regra simples de "todo sétimo dia". Domingo de Páscoa, por exemplo, não tem fórmula simples — a menos que você use a conta de Bloch ou algo similar, o que já é outro assunto. Mas pra domingo normal, todo domingo, a lógica acima cobre 99% dos casos.