Como funciona o sistema de cálculo de feriados e dias úteis no Brasil
A maioria das planilhas e sistemas que eu vejo nas empresas trata data como número puro. Isso funciona até você precisar calcular férias, rescisões ou vencimentos de impostos e perceber que o calendário brasileiro não é linear. O FeriadosBR e similares tentam resolver isso, mas a realidade é mais bagunçada. Tem o feriado nacional, o municipal, o estadual e aquele ponto facultativo que a prefeitura decide criar do nada. Se você trabalha com folha de pagamento ou desenvolvimento de sistemas, já sofreu com isso.
10 de abril é feriado
Não. Pelo menos não em nível nacional. Depende da sua cidade e do estado. Em 2025, por exemplo, 10 de abril caiu numa quinta-feira normal, sem relevância religiosa ou cívica federal. Mas em São Paulo, 10 de abril pode ser feriado municipal se a prefeitura decidir. Em 2018, Curitiba teve feriado em 10 de abril por uma lei local específica. A bagunça é real. Eu passei três horas numa terça-feira tentando justificar por que um sistema interno estava marcando o dia como útil para um cliente em Petrópolis, quando na verdade era feriado regional da Emancipação Política. A solução foi cruzar a tabela da SEFAZ com o calendário oficial do município, importado manualmente todo ano. Sim, manual. Nenhum API gratuita atualiza isso sozinho. O que muita gente não entende é que cálculo de dias úteis não é só subtrair fins de semana. Tem que considerar: páscoa (data móvel), carnaval (também móvel), feriados fixos como 7 de setembro e 12 de outubro, além dos municipais que variam de cidade para cidade. Um erro comum é usar bibliotecas genéricas como moment.js sem o plugin de feriados brasileiros. O resultado é que seu sistema vai 1º de janeiro como feriado, mas vai tratar 12 de outubro como dia útil normal, quebrando relatórios de produtividade.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Se você precisa de uma solução prática, o pacote nfbdate do PHP ou a tabela do Bacen para compensações bancárias são os padrões da indústria. Eles cobrem o essencial, mas ainda exigem manutenção manual para feriados municipais. Eu configurei um cron job que baixa o calendário oficial da SEFAZ de todos os 27 estados todo mês de dezembro, e gera um dump SQL que meu sistema consome. Demora cerca de 20 minutos para rodar, mas evita que eu perca dois dias refazendo contas no meio do ano. Se você usa Python, a biblioteca holidays com o subset do Brasil é mais rápida, mas tem o mesmo problema de atualização manual dos municipais. O ponto fraco de tudo isso é que feriados estaduais e municipais mudam por lei, e essas leis são publicadas em diários oficiais que nem sempre são digitalizados de forma consistente. Um colega meu gastou uma semana inteira tentando automatizar a coleta para o Rio Grande do Sul porque o site da Assembleia Legislativa mudou o layout sem aviso. A alternativa mais estável é pagar uma API como a Calnend.io ou usar o banco de dados do Serpro, que é mantido pelo governo federal e atualizado trimestralmente. Não é de graça, mas evita dor de cabeça.
Se o seu objetivo é só verificar se um dia específico é feriado, a lógica mais simples é: consulte primeiro a tabela nacional, depois a estadual do seu cliente, depois a municipal. Isso leva menos de 10 milissegundos por consulta em qualquer servidor razoável. O problema aparece quando você precisa calcular um intervalo de datas, como DiasCorridosEntre(). Aí sim, a complexidade explode. Recomendo nunca implementar isso do zero se não tiver tempo para testar contra pelo menos 5 anos de históricos. No fim das contas, tratar data no Brasil é menos sobre programação e mais sobre persistência em manter dados atualizados. Nenhum código resolve sozinho. O melhor que você pode fazer é ter uma fonte oficial, automatizar a ingestão e ter um alerta quando alguma data mudar sem aviso. Meu sistema atual tem um script que roda todo dia 15 do mês, compara o calendário importado com o anterior e gera um log de diferenças. Levou uma tarde para configurar, mas me poupou umas quatro horas por mês de trabalho manual. Se você estiver começando do zero, copie esse pattern. Vai economizar mais tempo do que tentar criar sua própria lógica mágica.