Domingo É O Primeiro Dia Da Semana - Domingo é o primeiro dia da semana,... Paulo Batista dos Santos - Pensador
Domingo é o primeiro dia da semana,... Paulo Batista dos Santos - Pensador

Como configurar seu sistema para tratar domingo como primeiro dia da semana

A maioria dos softwares que eu já vi no mercado usa segunda como início da semana, mas existem casos onde isso não funciona. Planilhas de ponto, sistemas de agendamento religioso, relatórios fiscais em alguns municípios brasileiros — tudo isso pode exigir domingo é o primeiro dia da semana como regra. Não é complicação desnecessária. É simplesmente como o negócio foi desenhado. Vou mostrar como lidar com isso na prática, porque perdi tempo demais no passado achando que bastava mudar uma configuração visual.

domingo é o primeiro dia da semana: o que isso significa na prática

Não se trata apenas de rearranjar os nomes dos dias numa grade. Quando você muda o início da semana, todas as funções que calculam numeração da semana, extração de semanas completas, agrupamentos por período e até fórmulas de folha de pagamento são afetadas. O problema é que a maioria das bibliotecas trata isso como um parâmetro cosmético, quando na realidade é estrutural. No Excel, por exemplo, a função WEEKNUM tem um segundo argumento. Se você passar o número 1 ou omitir, a semana começa no domingo. Se passar 2, começa na segunda. Parece simples, mas já vi gente usar a função padrão em planilhas de runtime onde o cliente espera semana começando no domingo e acaba colando valores errados nos relatórios mensais.

No Python, o weekday() retorna 0 para segunda e 6 para domingo por padrão. Já o isocalendar() segue a norma ISO 8601, que define segunda como primeiro dia. Se você precisa de domingo como referência, precisa fazer uma conversão explícita: (data.weekday() + 1) % 7. Simples, mas esqueci disso numa migração de sistema e o relatório saiu com todos os domingos empurrados para a semana seguinte. Demorei três horas pra achar a causa.

Workaround que eu uso e que resolve na maior parte dos casos

O meu método favorito é criar uma função utilitária única que centraliza a lógica. Em vez de espalhar ajustes por todo o código, eu tenho uma rotina que devolve o início da semana, o número da semana e o final da semana considerando domingo como referência. Aqui vai um exemplo mínimo em Python:

👉 Clique no botão abaixo para saber mais sobre o assunto!

def semana_domingo(data):
    dias_ate_domingo = data.weekday()
    inicio = data - timedelta(days=dias_ate_domingo)
    fim = inicio + timedelta(days=6)
    numero = int(inicio.strftime("%W")) + 1
    return inicio, fim, numero

Isso funciona porque strftime("%W") conta semanas começando no domingo, ao contrário de %U que também começa no domingo mas ignora os dias anteriores à primeira segunda do ano. A diferença entre %U e %W é sutil e causa erros quando o ano começa numa quarta, quinta ou sexta-feira. Eu caí nessa pegadinha duas vezes em anos diferentes. Para MySQL, a função WEEK() aceita um modo como terceiro parâmetro. O modo 1 conta semanas começando no domingo com o ano corrente, mas o modo 2 conta começando no domingo e ajustando o número da semana conforme o ISO. Se você precisa de compatibilidade com sistemas legados que usam modo 0 (segunda como início), precisa converter explicitamente os registros antes de migrar.

Pegadinhas que ninguém avisa

A primeira é sobre fim de semestre fiscal. Algumas cidades e estados brasileiros têm referências trimestrais que consideram o ciclo começando no domingo mais próximo do início do mês. Se você montar uma consulta agrupando por semana com a configuração padrão, os valores vão para o período errado e o conciliação falha. A segunda pegadinha é sobre APIs de terceiros. Plataformas como Google Calendar, Apple Calendar e serviços de RH muitas vezes definem o início da semana baseado na localidade do usuário. Se seu sistema consome dados de usuários de múltiplos países, um campo que vem como "início da semana" pode ser domingo para alguns e segunda para outros. Você precisa normalizar tudo no servidor, nunca confiar no client-side.

Uma terceira que eu encontrei recentemente: bibliotecas de relatórios como a ReportLab e o matplotlib não expõem um parâmetro direto para definir o início da semana em gráficos de barras temporais. Você precisa recalcular os rótulos manualmente antes de passar os dados para a biblioteca. Gastou duas tardes configurando isso num dashboard interno meu.

Quando isso não funciona

Existem cenários onde forçar domingo como primeiro dia da semana é pior do que aceitar a limitação. Sistemas legacy que embutem a lógica de semana no banco de dados sem parâmetros configuráveis não respondem bem a overrides. Se a tabela já tem colunas como semana_1, semana_2 calculadas via triggers, reescrever tudo pode ser mais caro do que manter segunda como padrão e ajustar apenas a camada de apresentação. Outro caso é quando você depende de integrações automáticas com órgãos públicos. A Receita Federal e a SEFAZ usam normas que tratam segunda como início. Forçar domingo nesses fluxos gera inconsistência que a validação automática rejeita. Nesses casos, a solução é manter a conformidade padrão nas integrações e usar a configuração de domingo apenas internamente, num camada separada.

Alternativa: normalize e apresente

Se o seu sistema precisa coexistir com ambos os modelos, a abordagem mais segura é armazenar tudo numa norma neutra — ISO 8601, segunda como início — e fazer a conversão na camada de exibição. Assim, seus cálculos internos não sofrem, e o usuário vê o que espera. Para planilhas, eu crio uma aba oculta com as conversões e deixei a aba visível com os rótulos ajustados. O trabalho manual inicial compensa porque elimina retrabalho mensal. Se você está começando do zero e precisa que domingo é o primeiro dia da semana seja a regra nativa, configure isso no nível da aplicação desde o primeiro commit. Revisão posterior é sempre mais custosa do que decisão temprana.