Datas e feriados

Feriados, dias úteis e datas por extenso.

  • Matriz de paridade

Add business days

Soma um número de dias úteis a uma data. Avança um dia do calendário por vez e conta só os dias que date.isBusinessDay aceita com as mesmas options.

  • Retorna uma nova data e mantém a hora do dia. A função nunca altera a entrada. Quando o dia do resultado não tem essa hora (um salto de horário de verão), o resultado é o instante mais próximo daquele dia.
  • Um amount de 0 retorna a mesma data, mesmo em um dia que não é útil. Um amount negativo recua.
  • options.includeOptional (padrão true) conta os feriados opcionais (segunda e terça de Carnaval, Corpus Christi) como dias não úteis. Com false, só contam os feriados national e state, então Corpus Christi continua contando no DF, no MA a partir de 2024 e no RJ a partir de 2026, onde é feriado estadual.
  • options.includeSaturday (padrão false) conta o sábado como dia útil, a contagem trabalhista do prazo do salário (CLT art. 459 § 1º, lida pela IN MTP nº 2/2021, art. 14, I). Domingo e feriados continuam excluídos, inclusive feriado que cai no sábado (Finados 02/11/2024, Independência 07/09/2024).
  • includeSaturday não cobre feriados municipais, que a IN também exclui. Uma contagem exata para um município precisa removê-los à parte. Por isso o nome da opção não promete "CLT".
  • Um valor avaliado como verdadeiro (truthy) que não é booleano (por exemplo "false") liga includeSaturday ou includeOptional.
  • options.stateCode é lido sem diferenciar maiúsculas de minúsculas e sem os espaços das pontas, como em toda função que recebe UF: "sp" e " SP " somam os feriados de São Paulo. Só um stateCode omitido (undefined) significa apenas feriados nacionais.
  • Um stateCode presente que não é sigla de estado ("XX", "", "__proto__", um número, null, um objeto) é rejeitado: a função retorna null sem olhar a data. A 2.4.0 recorria em silêncio aos feriados nacionais para uma sigla desconhecida ou em minúsculas, então "sp" contava 9 de julho como dia útil em São Paulo.
  • Retorna null para uma data inválida, um amount que não é inteiro finito, ou um início ou resultado fora dos anos 1900 a 2099.
  • O avanço sempre termina. A 2.4.0 podia entrar em loop infinito em fusos onde um dia local não existe (Pacific/Apia e Pacific/Fakaofo em 30/12/2011, Pacific/Kiritimati e Pacific/Enderbury em 31/12/1994, Pacific/Kwajalein em 21/08/1993); agora o avanço pula esse dia. O deslocamento de meia hora de Australia/Lord_Howe também foi corrigido. Os demais resultados não mudam.

Receitas (não existe helper próprio):

  • Próximo dia útil: addBusinessDays(d, 1).
  • N-ésimo dia útil do mês: addBusinessDays(new Date(y, m, 0), n), partindo do último dia do mês anterior. Se n passar do número de dias úteis do mês, o resultado cai no mês seguinte; confira o mês.
  • Último dia útil do mês: subBusinessDays(new Date(y, m + 1, 1), 1), partindo do primeiro dia do mês seguinte.
  • Casos-limite: o n-ésimo dia útil de janeiro/1900 e o último dia útil de dezembro/2099 retornam null, porque o dia de partida fica fora de 1900 a 2099.
  • Com { includeSaturday: true } a mesma receita dá o "quinto dia útil" trabalhista: addBusinessDays(new Date(2024, 2, 0), 5, { includeSaturday: true }) é quarta 06/03/2024, enquanto a contagem bancária, sem a opção, é quinta 07/03/2024.
ParâmetroTipoObrigatório
dateDatesim
amountnumbersim
optionsBusinessDayOptionsnão
options.stateCodeStateCodenão
options.includeOptionalbooleannão
options.includeSaturdaybooleannão
retornaDate | null

Soma dias úteis a uma data, pulando sábados, domingos e os feriados que isBusinessDay considera. Assinatura: addBusinessDays(date, amount, options?), a mesma do date-fns.

  • Opções (BusinessDayOptions, as mesmas de isBusinessDay): includeOptional (padrão true) também pula a segunda e a terça-feira de Carnaval e o Corpus Christi; includeSaturday (padrão false) conta o sábado como dia útil; stateCode também pula os feriados daquele estado.
  • Retorna um novo Date, com o horário preservado; date não é alterado.
  • amount igual a 0 retorna a mesma data, mesmo em fim de semana ou feriado. Um amount negativo anda para trás.
  • Retorna null quando date é inválido, amount não é um inteiro finito, stateCode está presente e não é uma sigla de estado ou o resultado sai dos anos de 1900 a 2099.
import { addBusinessDays } from '@brazilian-utils/brazilian-utils';

addBusinessDays(new Date(2024, 0, 2, 12), 1); // Date, 2024-01-03 12:00 (o dia seguinte já é útil)
addBusinessDays(new Date(2024, 11, 31, 12), 1); // Date, 2025-01-02 12:00 (2025-01-01 é Ano novo, pulado)
addBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-04 12:00 (anda para trás)
addBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (sem alteração, mesmo o sábado não sendo dia útil)
addBusinessDays(new Date(2024, 0, 5, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (contagem trabalhista, o sábado conta)
addBusinessDays(new Date(2024, 10, 1, 12), 1, { includeSaturday: true }); // Date, 2024-11-04 12:00 (2024-11-02 é Finados, feriado em um sábado)
addBusinessDays(new Date(2024, 6, 8, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-10 12:00 (2024-07-09 é a Revolução Constitucionalista em SP, pulado)
addBusinessDays(new Date('not a date'), 1); // null
addBusinessDays(new Date(2024, 0, 2), 1.5); // null (não é um número inteiro)
Código: brazilian-utils/javascript
Teste com JavaScript addBusinessDays
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca date.addBusinessDays

Esta função ainda não tem casos de teste compartilhados.

Escrever por extenso

Escreve uma data por extenso em português, por exemplo "primeiro de janeiro de dois mil e vinte e quatro".

  • value é uma data (a data local do calendário) ou uma string dd/mm/yyyy ou ISO yyyy-mm-dd.
  • options.style (padrão "full") escreve por extenso o dia, o mês e o ano ("dois de março de dois mil e vinte e quatro"). "month" escreve por extenso só o mês e deixa o dia e o ano em algarismos ("2 de março de 2024"), com o dia 1 como 1º ("1º de janeiro de 2024"). Qualquer outro valor é ignorado e usa-se "full".
  • options.weekday (padrão false) coloca na frente o nome do dia da semana em minúsculas e uma vírgula ("sábado, dois de março de dois mil e vinte e quatro"). O dia da semana vem da data resolvida: a data local de um valor de data, ou a data lida de uma string. Combina com os dois estilos.
  • style e weekday são lidos de forma estrita: só "month" e só true mudam a saída. "true" ou 1 em weekday não fazem nada.
  • O dia 1 é "primeiro" no estilo full.
  • No estilo full o ano é escrito como number.convertToWords o escreve (1999 vira "mil novecentos e noventa e nove", 2000 vira "dois mil"). O resultado é sempre em minúsculas.
  • 29 de fevereiro só é aceito em anos bissextos do calendário gregoriano proléptico (divisíveis por 4, exceto séculos não divisíveis por 400). Uma string precisa casar exatamente com dd/mm/yyyy ou yyyy-mm-dd, sem nenhum outro caractere em volta.

Decisão pendente

A referência (JS) escreve tudo em minúsculas e interpreta strings ISO. Go e Ruby usam inicial maiúscula e não interpretam strings ISO. Veja a decisão em aberto em docs/findings.md (em inglês).

Decisão pendente

A referência (JS) retorna uma string vazia para uma data inválida, uma string malformada, um dia ou mês que não existe ou um ano antes de 1. As outras bibliotecas retornam null. Veja a decisão em aberto em docs/findings.md (em inglês).

ParâmetroTipoObrigatório
valueDate | stringsim
optionsConvertDateToWordsOptionsnão
options.style"full" | "month"não
options.weekdaybooleannão
retornastring

Escreve uma data por extenso em português do Brasil: "01/01/2024" vira "primeiro de janeiro de dois mil e vinte e quatro". Aceita um Date, lido pela sua data de calendário local, ou uma string no formato "dd/mm/yyyy" ou ISO "yyyy-mm-dd".

  • Opções (ConvertDateToWordsOptions): style (padrão "full") escreve dia, mês e ano por extenso; "month" escreve só o mês e deixa dia e ano em dígitos, o dia 1 como "1º". weekday (padrão false) prefixa o nome do dia da semana em minúsculas e uma vírgula.
  • Retorna "" para um Date inválido, uma string malformada, um dia ou mês que não existe ou uma data anterior ao ano 1.
import { convertDateToWords } from '@brazilian-utils/brazilian-utils';

convertDateToWords('01/01/2024'); // "primeiro de janeiro de dois mil e vinte e quatro"
convertDateToWords('2024-01-02'); // "dois de janeiro de dois mil e vinte e quatro"
convertDateToWords(new Date(2024, 0, 1)); // "primeiro de janeiro de dois mil e vinte e quatro"
convertDateToWords('02/03/2024', { style: 'month' }); // "2 de março de 2024"
convertDateToWords('01/01/2024', { style: 'month' }); // "1º de janeiro de 2024"
convertDateToWords('02/03/2024', { weekday: true }); // "sábado, dois de março de dois mil e vinte e quatro"
convertDateToWords('10/05/1999'); // "dez de maio de mil novecentos e noventa e nove"
convertDateToWords('31/04/2024'); // "" (abril tem 30 dias)
convertDateToWords('invalid'); // ""
convertDateToWords('29/02/1900'); // "" (1900 não é bissexto)
Código: brazilian-utils/javascript
Teste com JavaScript convertDateToWords
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (37) e o resultado em cada biblioteca date.convertToWords

Difference in business days

Conta os dias úteis entre duas datas.

  • Conta earlierDate quando é dia útil e todos os dias úteis estritamente entre as duas. Nunca conta laterDate. A hora do dia é ignorada.
  • O resultado é negativo quando laterDate é antes de earlierDate, e 0 no mesmo dia do calendário.
  • options como em date.addBusinessDays: includeOptional, includeSaturday e stateCode. Com { includeSaturday: true }, de 01/01/2024 a 08/01/2024 dá 5 (1º de janeiro é feriado, domingo fica fora).
  • Retorna null quando uma das datas é inválida ou está fora dos anos 1900 a 2099, e quando options.stateCode está presente e não é sigla de estado (a 2.4.0 recorria aos feriados nacionais).
ParâmetroTipoObrigatório
laterDateDatesim
earlierDateDatesim
optionsBusinessDayOptionsnão
options.stateCodeStateCodenão
options.includeOptionalbooleannão
options.includeSaturdaybooleannão
retornanumber | null

Conta os dias úteis entre duas datas. Assinatura: differenceInBusinessDays(laterDate, earlierDate, options?), a mesma do date-fns.

  • Opções (BusinessDayOptions, as mesmas de isBusinessDay): includeOptional (padrão true) também pula a segunda e a terça-feira de Carnaval e o Corpus Christi; includeSaturday (padrão false) conta o sábado como dia útil; stateCode também pula os feriados daquele estado.
  • Conta earlierDate quando é dia útil e cada dia útil estritamente entre as duas datas; laterDate nunca é contado. O horário é ignorado.
  • O resultado é negativo quando laterDate é anterior a earlierDate, e 0 no mesmo dia de calendário.
  • Retorna null quando uma das datas não é um Date válido ou está fora dos anos de 1900 a 2099, ou quando stateCode está presente e não é uma sigla de estado.
import { differenceInBusinessDays } from '@brazilian-utils/brazilian-utils';

differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 1)); // 0 (01/01 é Ano novo, não contado)
differenceInBusinessDays(new Date(2024, 0, 3), new Date(2024, 0, 2)); // 1 (02/01 contado, uma terça-feira; 03/01 não)
differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 3)); // -1 (a data posterior vem primeiro, então a contagem é negativa)
differenceInBusinessDays(new Date(2024, 0, 2), new Date(2024, 0, 2)); // 0 (mesmo dia)
differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1)); // 4 (contagem de segunda a sexta, de 2024-01-02 a 2024-01-05)
differenceInBusinessDays(new Date(2024, 0, 8), new Date(2024, 0, 1), { includeSaturday: true }); // 5 (2024-01-06, um sábado, também conta)
differenceInBusinessDays(new Date(2024, 10, 4), new Date(2024, 10, 1), { includeSaturday: true }); // 1 (2024-11-02 é Finados, feriado em um sábado)
differenceInBusinessDays(new Date(2024, 6, 10), new Date(2024, 6, 8), { stateCode: 'SP' }); // 1 (09/07/2024 é feriado estadual em SP)
differenceInBusinessDays(new Date(), new Date('not a date')); // null
Código: brazilian-utils/javascript
Teste com JavaScript differenceInBusinessDays
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca date.differenceInBusinessDays

Esta função ainda não tem casos de teste compartilhados.

Get holidays

Retorna os feriados brasileiros de um ano, ordenados por data: os nacionais, mais os de um estado quando stateCode é informado.

  • options é { year, stateCode? }. O JavaScript também aceita só o ano, getHolidays(2024), para os feriados nacionais.
  • Cada feriado tem um nome, uma data e um type: national, state, optional (ponto facultativo) ou religious (Páscoa, listada por conveniência; nenhuma norma a declara).
  • stateCode é lido sem diferenciar maiúsculas de minúsculas e sem os espaços das pontas, como em toda função que recebe UF. Só um stateCode omitido (undefined) significa apenas feriados nacionais.
  • Um stateCode presente que não é sigla de estado ("XX", "", "__proto__", um número, null, um objeto) retorna uma lista vazia. A 2.4.0 retornava os feriados nacionais nesse caso, então { year: 2024, stateCode: "sp" } omitia os feriados de São Paulo.
  • Retorna uma lista vazia quando year não é um inteiro de 1900 a 2099.
  • Cada feriado só aparece nos anos em que a norma vigia:
    • Feriados nacionais de data fixa só aparecem nos anos em que uma norma federal os declarava. Finados aparece até 1948 e a partir de 2003, e não de 1949 a 2002 (a 2.4.0 listava todo ano). Nossa Senhora Aparecida aparece a partir de 1980. O Dia da Consciência Negra (20 de novembro) é nacional a partir de 2024.
    • O Natal aparece a partir de 1922, o Dia do trabalhador a partir de 1925, e Tiradentes até 1930, de 1933 a 1948 e a partir de 1951. A Lei nº 662/1949 tirou Finados dos feriados nacionais que o Decreto-lei nº 486/1938 listava, e a Lei nº 10.607/2002 o trouxe de volta. As outras festas nacionais do primeiro calendário republicano (24 de fevereiro, 3 de maio, 13 de maio, 14 de julho e 12 de outubro) aparecem até 1930, e 3 de maio (1936 a 1938), 16 de julho e 12 de outubro (1936 e 1937) de novo pela Lei nº 108/1935.
    • Feriados estaduais aparecem a partir do ano em que a lei passou a valer, e até o ano em que foi revogada.
  • A Sexta-feira Santa é national todo ano. A segunda e a terça de Carnaval e Corpus Christi são optional, os pontos facultativos do calendário federal (a 2.4.0 não listava a segunda).
  • Os itens optional são os pontos facultativos de dia inteiro do calendário federal (Portarias MGI nº 8.617/2023, 9.783/2024 e 11.460/2025, para 2024 a 2026): segunda e terça de Carnaval e Corpus Christi, os mesmos três dias em que o mercado financeiro não funciona (Resolução CMN nº 4.880/2020), mais os que uma norma estadual declara (8 de dezembro do AM a partir de 1999, 6 de março de PE em 2008 e 2009). Os parciais ficam de fora: Quarta-feira de Cinzas (até as 14h), 28 de outubro (Dia do Servidor Público) e as tardes de 24 e 31 de dezembro.
  • O 1º turno das eleições é feriado national: o primeiro domingo de outubro dos anos pares a partir de 1998 (15 de novembro em 2020), pelo art. 380 do Código Eleitoral. O 2º turno não é listado.
  • Antes de 1998, a Lei nº 1.266/1950 fez do dia das eleições gerais feriado nacional, então as realizadas em dia útil também são listadas: 3 de outubro de 1955 e 1958 (Eleições gerais) e de 1990 e 1994 (Eleições (primeiro turno)). 3 de outubro de 1960 e a eleição municipal de 3 de outubro de 1996 não são listadas. Sendo domingo, o dia da eleição nunca muda uma contagem de dias úteis.
  • Um item estadual com o mesmo nome e a mesma data de um nacional o substitui. Corpus Christi vem como state no DF, no MA a partir de 2024 e no RJ a partir de 2026, e continua ponto facultativo federal nos outros estados. A terça de Carnaval é feriado estadual no RJ desde 2009.
  • Dois deslocamentos de observância mudam a data estadual. O 30 de novembro de Alagoas volta para a segunda quando cai na terça e vai para a sexta quando cai na quinta (desde 2014, Lei AL nº 7.530/2013). O 11 de agosto (desde 2005) e o 25 de novembro (desde 1999) de Santa Catarina vão cada um para o domingo seguinte quando caem de segunda a sábado. A data magna de Pernambuco cai no primeiro domingo de março de 2010 a 2017 e em 6 de março desde 2018.
  • Uma lei estadual que o STF declarou inconstitucional não tem item em nenhum ano: o 18 de junho de Rondônia (ADI 3940) e o 25 de julho do Amapá (ADI 4820).
  • Goiás lista 26/07, 24/10 e 28/10 como os feriados estaduais do estatuto dos servidores do estado, desde 1986, e 2 de novembro como feriado goiano de 1986 a 2002, os anos em que Finados não era nacional. O 16/09 de Alagoas é feriado state desde 2011 (a 2.4.0 o tipava como optional até 2023).
  • Mudanças da 2.5.0, cada uma pela norma estadual citada no código JavaScript:
    • RJ: Corpus Christi a partir de 2026 (Lei RJ nº 11.002/2025, mantida pelo STF na ADI 7898, com trânsito em julgado em 13/08/2026). A 2.4.0 a tipava como optional, como nos outros estados.
    • AL: 20/11 de 1995 a 2023; 30/11 desde 2014 (vai para a segunda quando cai na terça e para a sexta quando cai na quinta).
    • AC: 20/01 desde 2017. AP: 20/11 de 2008 a 2023; 15/05 desde 2018. O 25/07 do AP não tem item em nenhum ano (veja abaixo).
    • MA: Corpus Christi desde 2024; 08/03 a partir de 2027. PB: 05/08 desde 1968.
    • SE: 08/07 desde 1990; 24/10 de 1989 a 1999. PR: 19/12 de 1963 a 2013 (Lei PR 4.658/1962, revogada pela Lei PR 18.384/2014).
    • PE: 06/03 em 2008 e 2009 como optional (Lei PE 13.386/2007). AM: 08/12 como optional a partir de 1999 (o estado declara ponto facultativo nas suas repartições por decreto, DOE-AM de 02/12/2025; a norma mais antiga localizada é a Lei Municipal de Manaus nº 496/1999). A 2.4.0 a listava desde 1900.
  • Retorna uma lista vazia quando o argumento não é número nem objeto.
  • Feriados municipais não são cobertos.
  • Mudanças de um ano feitas por decreto não entram; a tabela mantém a data da lei. Exemplos: o Decreto GO nº 10.935/2026 moveu 26/07/2026 para 20/07, e Goiás moveu 28/10/2026 para 30/10.
  • Também não é aplicada a lei do Acre que adia para a sexta-feira os feriados que caem de terça a quinta (Lei AC nº 2.126/2009), porque os decretos anuais do próprio estado a aplicam de forma desigual (2026 move 20/01 e deixa 17/11, uma terça, no lugar).
ParâmetroTipoObrigatório
optionsGetHolidaysParamssim
options.yearnumbersim
options.stateCodeStateCodenão
retornaHoliday[]

Retorna os feriados brasileiros de um ano: os nacionais e, com um stateCode, também os daquele estado. Aceita um ano ou { year, stateCode } (GetHolidaysParams).

  • Cada feriado é um Holiday cujo type (HolidayType) é "national", "state", "optional" ou "religious". Os feriados vêm ordenados por data.
  • O "Dia da Consciência Negra", 20/11, é nacional a partir de 2024.
  • O primeiro turno das eleições, "Eleições (primeiro turno)", é feriado nacional nos anos pares a partir de 1998 (Código Eleitoral, art. 380): o primeiro domingo de outubro, ou 15/11 em 2020 (EC nº 107/2020). O segundo turno fica de fora, porque só acontece onde é necessário. Por cair num domingo, nunca muda uma contagem de dias úteis. Antes de 1998, a Lei nº 1.266/1950 fazia do dia das eleições gerais um feriado nacional, então as que caíram num dia de semana também são listadas: 3/10 de 1955 e 1958 ("Eleições gerais") e de 1990 e 1994 ("Eleições (primeiro turno)"). O 3/10/1960 fica de fora, porque nenhum texto oficial encontrado data a eleição presidencial daquele ano, assim como a eleição municipal de 3/10/1996.
  • Cada feriado nacional de data fixa só é listado nos anos em que uma norma federal o declarava (a Sexta-feira Santa, que as portarias do calendário federal listam como feriado nacional todo ano, é listada em todos os anos): Nossa Senhora Aparecida a partir de 1980, Natal a partir de 1922, Dia do trabalhador a partir de 1925, Tiradentes até 1930, de 1933 a 1948 e a partir de 1951, e Finados até 1948 e a partir de 2003. A Lei nº 662/1949 deixou Finados fora dos feriados nacionais que o Decreto-lei nº 486/1938 listava, e só a Lei nº 10.607/2002 o recolocou (o parecer da Câmara sobre o projeto: "Só inova ao sugerir o dia de finados"); até a 2.4.0 ele era listado em todos os anos. As outras "festas nacionais" do primeiro calendário republicano (Decreto nº 155-B/1890 e Decreto nº 3/1891: 24/2, 3/5, 13/5, 14/7 e 12/10) são listadas até 1930, e o 3/5 (de 1936 a 1938), o 16/7 e o 12/10 (em 1936 e 1937) de novo pela Lei nº 108/1935.
  • As entradas "optional" são os pontos facultativos de dia inteiro do calendário federal (Portarias MGI nº 8.617/2023, 9.783/2024 e 11.460/2025, de 2024 a 2026, que listam as duas datas de Carnaval como ponto facultativo, nunca como feriado nacional): a segunda e a terça-feira de Carnaval e o Corpus Christi, os mesmos três dias que o mercado financeiro não conta como úteis (Resolução CMN nº 4.880/2020), mais os estaduais que uma norma estadual declara (o 08/12 do AM a partir de 1999, que o estado declara para as suas repartições por decreto, e o 06/03 de PE em 2008 e 2009). O includeOptional liga e desliga exatamente esses. Os parciais ficam de fora: a Quarta-feira de Cinzas (até as 14h), 28/10 (Dia do Servidor Público) e as tardes de 24/12 e 31/12.
  • As regras por estado (o deslocamento para domingo em SC da data que cai de segunda a sábado, como o Decreto SC nº 1.460/2018 fez com o 11/08 que caiu num sábado; a data magna de PE no primeiro domingo de março de 2010 a 2017; o 30/11 de AL antecipado para segunda quando cai na terça e adiado para sexta quando cai na quinta, o Corpus Christi no DF, no MA (desde 2024) e no RJ (desde 2026), e a terça-feira de Carnaval no RJ com tipo "state", datas que deixaram de ser feriado) seguem a lei de cada estado; veja a fonte para a lista. O 16/09 de AL é feriado estadual a partir de 2011, como os decretos de calendário do estado o chamam antes da Lei AL nº 9.358/2024. Uma lei estadual que o STF derrubou não tem entrada em nenhum ano: o 18/06 de RO (ADI 3940) e o 25/07 do AP (ADI 4820).
  • Outros deslocamentos não são aplicados e a data da lei é a retornada: a lei do AC adia para a sexta-feira os feriados que caem de terça a quinta (Lei AC nº 2.126/2009), mas os próprios decretos anuais do estado a aplicam de forma desigual (em 2026 o 20/1 é adiado e o 17/11, uma terça, fica na data).
  • As três datas de GO (26/7, 24/10, 28/10) são os "feriados estaduais" do estatuto dos servidores do estado, listados a partir de 1986 (Lei GO nº 9.990/1986, depois Lei GO nº 10.460/1988 e Lei GO nº 20.756/2020, art. 269, II); os mesmos estatutos faziam do 2/11 feriado em GO de 1986 a 2002, os anos em que ele não era nacional. Não foi achada lei goiana que fixe uma data magna como feriado civil. O governador transfere o 26/7 por decreto todo ano (2025: 28/7; 2026: 20/7), e o 28/10 na maioria dos anos (2025: 27/10; 2026: 30/10), então a data da lei, que é a retornada aqui, muitas vezes não é o dia observado.
  • Cada feriado estadual só é listado a partir do primeiro ano em que a sua lei estadual se aplicava (o 9 de julho de SP a partir de 1997, o São Jorge do RJ a partir de 2008, o 11 de agosto de SC a partir de 2004), então um ano mais antigo tem menos feriados estaduais.
  • stateCode ignora maiúsculas/minúsculas e espaços nas pontas ('sp' é 'SP'). Só um stateCode omitido (ou undefined) pede apenas os feriados nacionais: qualquer outro valor que não seja uma sigla de estado ('XX', '', um valor que não é string) retorna []. Até a 2.4.0 um código desconhecido era ignorado e os feriados nacionais eram retornados, então um erro de digitação como 'sp' perdia os feriados do estado sem aviso.
  • Retorna [] quando o ano não é um inteiro de 1900 a 2099, ou quando o argumento não é nem número nem objeto.
import { getHolidays } from '@brazilian-utils/brazilian-utils';

// Obtém os feriados de 2024, nacionais e facultativos
getHolidays(2024);
// [
//   { name: 'Ano novo', date: Date('2024-01-01'), type: 'national' },
//   { name: 'Carnaval (segunda-feira)', date: Date('2024-02-12'), type: 'optional' },
//   { name: 'Carnaval (terça-feira)', date: Date('2024-02-13'), type: 'optional' },
//   { name: 'Sexta-feira Santa', date: Date('2024-03-29'), type: 'national' },
//   { name: 'Páscoa', date: Date('2024-03-31'), type: 'religious' },
//   { name: 'Tiradentes', date: Date('2024-04-21'), type: 'national' },
//   { name: 'Dia do trabalhador', date: Date('2024-05-01'), type: 'national' },
//   { name: 'Corpus Christi', date: Date('2024-05-30'), type: 'optional' },
//   { name: 'Independência do Brasil', date: Date('2024-09-07'), type: 'national' },
//   { name: 'Eleições (primeiro turno)', date: Date('2024-10-06'), type: 'national' },
//   { name: 'Nossa Senhora Aparecida', date: Date('2024-10-12'), type: 'national' },
//   { name: 'Finados', date: Date('2024-11-02'), type: 'national' },
//   { name: 'Proclamação da República', date: Date('2024-11-15'), type: 'national' },
//   { name: 'Dia da Consciência Negra', date: Date('2024-11-20'), type: 'national' },
//   { name: 'Natal', date: Date('2024-12-25'), type: 'national' },
// ]

// Obtém feriados para um estado específico
getHolidays({ year: 2024, stateCode: 'SP' });
// Inclui feriados nacionais mais feriados estaduais (ex: "Revolução Constitucionalista")

Fonte: src/get-holidays/constants.ts, Lei nº 662/1949, Lei nº 9.093/1995.

Código: brazilian-utils/javascript
Teste com JavaScript getHolidays
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (14) e o resultado em cada biblioteca date.getHolidays

Is business day

Verifica se uma data é dia útil, pela data local do calendário. Dia útil não é sábado, domingo nem feriado de date.getHolidays para o mesmo estado.

  • options.includeOptional (padrão true) conta os feriados opcionais (segunda e terça de Carnaval, Corpus Christi e os itens optional de um estado, o 8 de dezembro do AM e o 6 de março de PE em 2008 e 2009) como dias não úteis. Com false, só contam os feriados national e state, então Corpus Christi continua contando no DF, no MA a partir de 2024 e no RJ a partir de 2026, onde é feriado estadual.
  • options.includeSaturday (padrão false) conta o sábado como dia útil, a contagem trabalhista do prazo do salário (CLT art. 459 § 1º, lida pela IN MTP nº 2/2021, art. 14, I). Domingo e feriados continuam excluídos, inclusive feriado que cai no sábado (Finados 02/11/2024, Independência 07/09/2024).
  • includeSaturday não cobre feriados municipais, que a IN também exclui. Uma contagem exata para um município precisa removê-los à parte. Por isso o nome da opção não promete "CLT".
  • Um valor avaliado como verdadeiro (truthy) que não é booleano (por exemplo "false") liga includeSaturday ou includeOptional.
  • Um options que não é objeto é ignorado, como se tivesse sido omitido.
  • options.stateCode é lido sem diferenciar maiúsculas de minúsculas e sem os espaços das pontas, como em toda função que recebe UF: "sp" e " SP " somam os feriados de São Paulo. Só um stateCode omitido (undefined) significa apenas feriados nacionais.
  • Um stateCode presente que não é sigla de estado ("XX", "", "__proto__", um número, null, um objeto) é rejeitado: a função retorna false sem olhar a data. A 2.4.0 recorria em silêncio aos feriados nacionais para uma sigla desconhecida ou em minúsculas, então "sp" contava 9 de julho como dia útil em São Paulo.
  • Isso não é, por si só, o calendário bancário ou forense: bancos também fecham nos feriados locais da agência, e tribunais seguem calendários próprios.
  • Retorna false para uma data inválida ou um ano fora de 1900 a 2099.
ParâmetroTipoObrigatório
valueDatesim
optionsBusinessDayOptionsnão
options.stateCodeStateCodenão
options.includeOptionalbooleannão
options.includeSaturdaybooleannão
retornaboolean

Verifica se uma data é dia útil no Brasil: não é sábado, domingo nem um feriado que getHolidays lista para o seu dia de calendário local.

  • Opções (BusinessDayOptions, as mesmas de todos os utilitários de dias úteis): includeOptional (padrão true) também conta os feriados "optional", a segunda e a terça-feira de Carnaval e o Corpus Christi, como dias não úteis; includeSaturday (padrão false) conta o sábado como dia útil; stateCode também conta os feriados daquele estado.
  • Com includeSaturday desligado, é uma contagem de segunda a sexta. Ela não é, por si só, o calendário de bancos ou tribunais: o mercado financeiro também não conta a segunda e a terça-feira de Carnaval e o Corpus Christi (Resolução CMN nº 4.880/2020, art. 6º), que o includeOptional padrão cobre, e os bancos fecham nos feriados locais; a Justiça Federal também fecha de 20/12 a 6/1, de quarta-feira santa ao domingo de Páscoa, na segunda e na terça-feira de Carnaval, em 11/8, 1º e 2/11 e 8/12 (Lei nº 5.010/1966, art. 62), e os prazos processuais seguem o calendário de cada tribunal (CPC, art. 216). Ligado, é a contagem trabalhista do prazo de pagamento do salário do art. 459, § 1º, da CLT, a que a fiscalização do trabalho lê pela Instrução Normativa MTP nº 2/2021, art. 14, I: "na contagem dos dias será incluído o sábado, excluindo-se o domingo e o feriado, inclusive o municipal".
  • Com includeSaturday ligado, o domingo e os feriados continuam excluídos, então um feriado que cai em um sábado continua não sendo dia útil.
  • O trecho "inclusive o municipal" dessa regra não é coberto: getHolidays tem apenas feriados nacionais e estaduais, então um feriado municipal é contado aqui como dia útil comum. Retire os feriados municipais por conta própria quando a contagem precisar ser exata para um município.
  • Retorna false quando value não é um Date válido ou o seu ano está fora de 1900 a 2099, ou quando stateCode está presente e não é uma sigla de estado ('XX', '', um valor que não é string). Maiúsculas/minúsculas e espaços nas pontas de stateCode são ignorados.
import { isBusinessDay } from '@brazilian-utils/brazilian-utils';

isBusinessDay(new Date(2024, 0, 2)); // true (terça-feira, não é feriado)
isBusinessDay(new Date(2024, 0, 1)); // false (Ano novo)
isBusinessDay(new Date(2024, 0, 6)); // false (sábado)
isBusinessDay(new Date(2024, 0, 6), { includeSaturday: true }); // true (contagem trabalhista)
isBusinessDay(new Date(2024, 8, 7), { includeSaturday: true }); // false (Independência, feriado em um sábado)
isBusinessDay(new Date(2024, 0, 7), { includeSaturday: true }); // false (o domingo nunca é incluído)
isBusinessDay(new Date(2024, 1, 12)); // false (segunda-feira de Carnaval, feriado facultativo, conta por padrão)
isBusinessDay(new Date(2024, 1, 13)); // false (terça-feira de Carnaval, feriado facultativo, conta por padrão)
isBusinessDay(new Date(2024, 1, 13), { includeOptional: false }); // true
isBusinessDay(new Date(2024, 6, 9), { stateCode: 'SP' }); // false (Revolução Constitucionalista)
isBusinessDay(new Date(2024, 6, 9)); // true (feriado estadual ignorado sem stateCode)
isBusinessDay(new Date('not a date')); // false
Código: brazilian-utils/javascript
Teste com JavaScript isBusinessDay
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca date.isBusinessDay

Esta função ainda não tem casos de teste compartilhados.

Is holiday

Verifica se uma data é feriado no Brasil, pela data local do calendário.

  • options traz a data alvo e, opcionalmente, a sigla de um estado cujos feriados também contam. Todo feriado que date.getHolidays lista conta, inclusive os opcionais e o 1º turno das eleições.
  • options.stateCode é lido sem diferenciar maiúsculas de minúsculas e sem os espaços das pontas, como em toda função que recebe UF: "sp" e " SP " somam os feriados de São Paulo. Só um stateCode omitido (undefined) significa apenas feriados nacionais.
  • Um stateCode presente que não é sigla de estado ("XX", "", "__proto__", um número, null, um objeto) é rejeitado: a função retorna false sem olhar a data. A 2.4.0 recorria em silêncio aos feriados nacionais para uma sigla desconhecida ou em minúsculas, então "sp" não reconhecia 9 de julho como feriado em São Paulo.
  • options.targetDate é a data a verificar. Ela é lida pelo dia local do calendário, não pelo instante em UTC. options.stateCode é opcional.
  • Retorna false quando targetDate está ausente ou não é uma data válida, e quando stateCode está presente e não é sigla de estado, mesmo num feriado nacional.
  • Retorna false para um ano fora de 1900 a 2099, onde date.getHolidays não lista nada.
  • Os itens optional e religious de date.getHolidays contam: segunda e terça de Carnaval, Corpus Christi e Páscoa fazem a função retornar true. Não há includeOptional aqui, ao contrário de date.isBusinessDay.
ParâmetroTipoObrigatório
optionsIsHolidayParamsnão
options.targetDateDatenão
options.stateCodeStateCodenão
retornaboolean

Verifica se uma data é feriado brasileiro. Aceita { targetDate, stateCode? } (IsHolidayParams).

  • A verificação usa a data de calendário local de targetDate, não o seu instante UTC.
  • stateCode também considera os feriados daquele estado, lido como em getHolidays (maiúsculas/minúsculas e espaços nas pontas são ignorados).
  • Retorna false quando targetDate está ausente ou não é um Date válido, ou quando stateCode está presente e não é uma sigla de estado ('XX', '', um valor que não é string), mesmo num feriado nacional.
  • Retorna false para um ano fora de 1900 a 2099, em que o getHolidays não lista nada.
  • As entradas "optional" e "religious" do getHolidays contam: segunda e terça de Carnaval, Corpus Christi e Páscoa fazem o isHoliday retornar true. Aqui não há includeOptional, ao contrário do isBusinessDay.
import { isHoliday } from '@brazilian-utils/brazilian-utils';

isHoliday({ targetDate: new Date(2024, 0, 1) }); // true
isHoliday({ targetDate: new Date(2024, 6, 9), stateCode: 'SP' }); // true
isHoliday(); // false
Código: brazilian-utils/javascript
Teste com JavaScript isHoliday
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (5) e o resultado em cada biblioteca date.isHoliday

Sub business days

Subtrai um número de dias úteis de uma data. É o mesmo que date.addBusinessDays com o amount oposto.

  • Mesmas regras e opções de date.addBusinessDays (includeOptional, includeSaturday, stateCode), inclusive a mesma ressalva sobre a hora do dia. Um amount negativo avança.
  • Último dia útil do mês: subBusinessDays(new Date(y, m + 1, 1), 1). Para dezembro/2099 isso retorna null, porque o dia de partida fica em 2100.
ParâmetroTipoObrigatório
dateDatesim
amountnumbersim
optionsBusinessDayOptionsnão
options.stateCodeStateCodenão
options.includeOptionalbooleannão
options.includeSaturdaybooleannão
retornaDate | null

Subtrai dias úteis de uma data. subBusinessDays(date, amount, options?) é addBusinessDays(date, -amount, options).

  • As mesmas regras de addBusinessDays, BusinessDayOptions incluídas. Um amount negativo anda para frente.
import { subBusinessDays } from '@brazilian-utils/brazilian-utils';

subBusinessDays(new Date(2024, 0, 5, 12), 1); // Date, 2024-01-04 12:00 (o dia anterior já é útil)
subBusinessDays(new Date(2024, 0, 8, 12), 1); // Date, 2024-01-05 12:00 (anda para trás passando pelo fim de semana)
subBusinessDays(new Date(2025, 0, 2, 12), 1); // Date, 2024-12-31 12:00 (2025-01-01 é Ano novo, pulado)
subBusinessDays(new Date(2024, 0, 5, 12), -1); // Date, 2024-01-08 12:00 (anda para frente)
subBusinessDays(new Date(2024, 0, 6, 12), 0); // Date, 2024-01-06 12:00 (sem alteração, mesmo o sábado não sendo dia útil)
subBusinessDays(new Date(2024, 0, 8, 12), 1, { includeSaturday: true }); // Date, 2024-01-06 12:00 (contagem trabalhista, o sábado conta)
subBusinessDays(new Date(2024, 10, 4, 12), 1, { includeSaturday: true }); // Date, 2024-11-01 12:00 (2024-11-02 é Finados, feriado em um sábado)
subBusinessDays(new Date(2024, 6, 10, 12), 1, { stateCode: 'SP' }); // Date, 2024-07-08 12:00 (2024-07-09 é a Revolução Constitucionalista em SP, pulado)
subBusinessDays(new Date('not a date'), 1); // null
subBusinessDays(new Date(2024, 0, 2), 1.5); // null (não é um número inteiro)

Para o n-ésimo dia útil de um mês, ou o último, comece do dia logo fora do mês:

import { addBusinessDays, subBusinessDays } from '@brazilian-utils/brazilian-utils';

// n-ésimo dia útil do mês: some n a partir do último dia do mês anterior
addBusinessDays(new Date(2024, 0, 0), 5); // Date, 2024-01-08 00:00 (5º dia útil de janeiro de 2024)
addBusinessDays(new Date(2024, 1, 0), 10); // Date, 2024-02-16 00:00 (10º de fevereiro de 2024, segunda e terça-feira de Carnaval puladas)

// último dia útil do mês: subtraia 1 a partir do primeiro dia do mês seguinte
subBusinessDays(new Date(2024, 3, 1), 1); // Date, 2024-03-28 00:00 (2024-03-29 é Sexta-feira Santa, seguida de um fim de semana)
subBusinessDays(new Date(2024, 1, 1), 2); // Date, 2024-01-30 00:00 (penúltimo de janeiro de 2024)

// prazo do salário do art. 459, § 1º, da CLT: o 5º dia útil na contagem trabalhista
addBusinessDays(new Date(2024, 2, 0), 5, { includeSaturday: true }); // Date, 2024-03-06 00:00 (2024-03-02, um sábado, conta; a contagem de segunda a sexta dá 2024-03-07)
addBusinessDays(new Date(2024, 10, 0), 5, { includeSaturday: true }); // Date, 2024-11-07 00:00 (2024-11-02 é Finados, um feriado num sábado)
subBusinessDays(new Date(2024, 8, 1), 1, { includeSaturday: true }); // Date, 2024-08-31 00:00 (último dia útil de agosto de 2024, um sábado)
  • Um n maior que os dias úteis do mês cai no mês seguinte (addBusinessDays(new Date(2024, 0, 0), 23) é 2024-02-01, janeiro de 2024 tem 22); compare getMonth() quando isso importar.
  • O "quinto dia útil" do salário, do art. 459, § 1º, da CLT, é a contagem trabalhista: passe { includeSaturday: true }. Os feriados municipais, que essa contagem também exclui, a biblioteca não conhece, então um feriado municipal no começo do mês ainda precisa ser descontado por quem chama.
  • O n-ésimo dia útil de janeiro de 1900 e o último dia útil de dezembro de 2099 retornam null, porque a receita parte de um dia fora dos anos suportados (31 de dezembro de 1899 e 1º de janeiro de 2100).
Código: brazilian-utils/javascript
Teste com JavaScript subBusinessDays
As entradas começam com o primeiro caso compartilhado. Mude uma para ver o novo resultado.

Roda @brazilian-utils/brazilian-utils 2.5.0 no seu navegador.

Casos de teste compartilhados (0) e o resultado em cada biblioteca date.subBusinessDays

Esta função ainda não tem casos de teste compartilhados.

Fontes oficiais

Atualizado em

Nesta página