A disputa milenar entre domingo e segunda-feira
Quem trabalha com calendários, agendamentos e sistemas de folha de ponto sabe que essa pergunta nunca é apenas uma curiosidade cultural. Tem consequences reais. O ISO 8601, a norma internacional que define representações de datas e horas, declarou há décadas que a semana começa na segunda-feira. Isso é o padrão para banco de dados, APIs, planilhas do Excel, sistemas ERP e praticamente toda ferramenta enterprise no Brasil e na Europa. Mas o dia a dia das pessoas não segue norma alguma.
a semana começa no domingo ou na segunda — e isso quebra código se você não prestar atenção
Eu já perdi uma manhã inteira debugando um sistema de escala hospitalar porque o módulo de agendamento usava o padrão ISO (segunda como dia 1) enquanto a interface de entrada dos enfermeiros estava configurada para o padrão norte-americano (domingo como dia 1). O resultado eram escalas que caíam um dia adiantado em relação ao que o pessoal esperava. A correção foi simples: centralizar a conversão de fuso e de weekday em uma única função utilitária, em vez de espalhar parseInt e Date.getDay() por dezenas de componentes. A função mapeia o weekday do JavaScript, que retorna 0 para domingo, para a numeração que cada módulo espera. Depois disso, o bug sumiu e não voltou mais. O problema é que não existe um único jeito de resolver isso. Depende de onde você está parado. Vou explicar como as coisas funcionam na prática, sem romantismo.
Os dois campos de batalha
No padrão ISO 8601, segunda é o dia 1 e domingo é o dia 7. Esse é o formato que você vê em documentos oficiais, em sistemas contábeis, em tabelas de consulta de CEI e em praticamente qualquer backend sério que eu já vi. Se você abrir uma consulta SQL com DATEPART(weekday, ...) no SQL Server configurado para português do Brasil, vai precisar verificar o @@DATEFIRST porque o padrão pode variar dependendo da configuração do servidor. Isso já conta como a primeira armadilha. Do outro lado, o padrão americano e o calendário civil de muitos países latino-americanos tratam domingo como o primeiro dia. No Brasil, isso se reflete em como as pessoas montam agendas, marcam consultas, organizam eventos religiosos e até em como certos softwares domésticos renderizam o mês. Calendários de parede, aplicativos de telefone e planilhas caseiras frequentemente exibem domingo na coluna da esquerda. Não é fraqueza de cultura, é convenção estabelecida há muito tempo.
O JavaScript entrega o número do dia da semana com getDay(), e ele retorna 0 para domingo, 1 para segunda e assim por diante. Ou seja, o JavaScript já nasce alinhado ao padrão americano, não ao ISO. Se você escrever uma função que considera segunda como zero, vai ter que converter explicitamente para qualquer coisa que siga a norma internacional.
O que acontece quando você mistura os dois padrões
Aqui entra a parte que eu vejo todo mundo errando. Quando você pega uma data, extrai o weekday com getDay() e usa esse valor diretamente para calcular início e fim de semana, está assumindo implicitamente que a semana começa no domingo. Se passar essa lógica para um relatório que será consumido por um sistema ISO, o relatório vai estar deslocado. Não é um erro visual. É um erro de dado. Um caso concreto: eu trabalhei numa integração entre um app de ponto digital e o servidor de RH de uma empresa. O app enviava o range de datas da semana considerando domingo a sábado. O servidor esperava segunda a domingo. O resultado era que os relatórios de horas extras fechavam com um dia a mais ou a menos, dependendo de como a borda do mês caía. A solução não foi mudar o app nem o servidor isoladamente. Foi criar uma camada de adaptação que normaliza todas as entradas para o intervalo ISO antes de persistir, e só converte na apresentação final, se o usuário realmente precisar ver domingo primeiro.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Essa camada de adaptação é o que diferencia quem implementa calendários de quem apenas cologa bibliotecas e torce para dar certo. Bibliotecas como moment.js (que já está em desuso recomendado), dayjs e date-fns oferecem funções de localization, mas a configuração de primeiro dia da semana nem sempre é óbvia. No date-fns, você passa o argumento weekStartsOn. Em algumas versões antigas do diajs, o plugin i18n fazia a conversão, mas se você não o importasse, o comportamento recaía no padrão da biblioteca, que pode não ser o que você espera.
Dica prática para não errar na hora de implementar
Defina uma convenção no nível da arquitetura. Escolha um único formato interno, recomendo o ISO, e trate todas as interfaces de entrada e saída como camadas de apresentação. Isso elimina a maior parte dos bugs de fuso e de weekday. Antes de codar, escreva essa decisão num comentário no repositório ou numa nota de arquitetura. Parece besteira, mas evita que o próximo desenvolvedor reinvente a roda de novo. Se você está usando Excel, lembre-se de que a função CORRESP e as tabelas dinâmicas podem usar a configuração regional da sua instalação. A semana começa na segunda ou no domingo dependendo de como o Excel foi instalado. Verifique em Arquivo > Opções > Configurações Avançadas > Opções de edição para ver qual o primeiro dia da semana definido. Essa configuração afeta fórmulas e macros que dependem de WEEKDAY.
Em Python, a biblioteca datetime retorna weekday() onde segunda é 0 e domingo é 6, e isocalendar() retorna a numeração ISO completa com year, week e weekday. Se você precisar de consistência, use isocalendar(). Eu já vi gente usando datetime.weekday() para calcular ranges de semana e depois se perguntando por quê os resultados não batiam com a exportação do sistema legado. A resposta quase sempre era essa confusão entre as duas contagens.
Quando nenhuma convenção serve
Existem cenários em que nem ISO nem o padrão americano resolvem. O calendário religioso judaico começa no sábado à noite, para fins de Shabat. Alguns setores de varejo no Brasil organizam campanhas semanais de promoção começando no sábado, porque o movimento de fim de semana é diferente. Se seu sistema precisa lidar com esses casos, você não deve forçar uma normalização genérica. Crie enumeradores específicos por domínio e trate cada um separadamente. A limitação mais importante que preciso deixar clara é que nenhuma biblioteca ou função mágica vai salvar você se a fonte dos dados já estiver errada. Se um CSV traz datas com coluna de weekday numerada de forma ambígua, você vai precisar mapear manualmente. Não confie em suposições baseadas no nome da coluna. Verifique a origem, registre a convenção usada e valide com amostras reais antes de automatizar anything.
A pergunta a semana começa no domingo ou na segunda não tem resposta universal. Tem resposta contextual. Se você está construindo um sistema novo, adote ISO e documente. Se está integrando com algo legado, descubra qual convenção aquele legado usa e normalize na fronteira. Se está apenas usando uma planilha ou um app de calendário no dia a dia, saiba que a exibição pode variar conforme a região e as configurações do seu dispositivo, e isso não significa que algo esteja quebrado. Significa que existem múltiplas convenções coexistindo, e o trabalho de quem implementa é fazer essa coexistência não virar bagunça nos dados.