Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calcular e listar os feriados brasileiros #153

Open
mariofts opened this issue Oct 17, 2014 · 12 comments
Open

Calcular e listar os feriados brasileiros #153

mariofts opened this issue Oct 17, 2014 · 12 comments
Labels
Aceitando contribuições epic Tarefa principal de uma melhoria extensa

Comments

@mariofts
Copy link
Member

Algum projeto para identificar e calcular os feriados nacionais, municipais e estaduais.

Algumas datas são fixas, como Natal, algumas precisam ser calculadas, como carnaval.

Deve permitir extensão simples, para incluir novos feriados sem necessidade de recompilar tudo.

@erickrar
Copy link
Contributor

Parece interessante! Irei dar uma estudada nas soluções.

@peruzzo
Copy link

peruzzo commented Oct 21, 2014

Seria muito boa essa funcionalidade!!!

Atualmente estou utilizando um framework chamado jollyday mas é um projeto que pelo visto está descontinuado e tem poucos feriados municipais e estaduais mapeados nele ... além de não ter suporte a nova api de datas do Java 8, ficando restrito meu projeto a usar o Joda Time ou a antiga api.

http://jollyday.sourceforge.net/
https://github.com/Nephtys/jollyday/blob/master/src/main/resources/holidays/Holidays_br.xml

Acho que esse projeto pode ajudar vocês a começarem algo.

@erickrar
Copy link
Contributor

@peruzzo Só me assusta o tamanho e a quantidade de XML's, mas pelo que vi essa é a API mais famosinha.

Trabalhei pouco com datas, nunca usei nada além do Calendar. Se tiverem alguma recomendação para uso(calendar mesmo, joda-time etc), posso começar essa semana a trabalhar nisso.

@renatoargh
Copy link

👍

@erickrar
Copy link
Contributor

erickrar commented Nov 6, 2014

@mariofts Fiz um pull request apenas para ver se está indo no caminho certo.
um exemplo de uso:

int ano = 2017;
    System.out.println("Lista de feriados nacionais do ano de " +ano+ ":");
            for(Feriado f: FeriadosNacionais.doAno(ano)){
                System.out.println(f);
            }

            for(Feriado f: new FeriadoControle().feriadosNacionais(2020).feriadosEstaduais(Lugares.RJ).listarFeriados()){
                System.out.println(f);
            }

Falta adicionar muita coisa(Exceções, métodos funcionais etc) e eu to pensando em trocar o nome do feriado por key, e o nome ficaria em um arquivo .properties.

Só gostaria de um feedback mesmo para saber se estou indo no caminho certo. :)

@mariofts
Copy link
Member Author

Oi @erickrar, vo dar uma olhada no seu código e te dou um feedback sim.

Vou pegar alguns exemplos de outras linguagens pra ver como resolvem isso, talvez possamos usar algumas idéias pra deixar mais simples de usar.

Abraços

@valdineyap
Copy link

Cara, a API mais simples e completa que eu conheço é desse site aqui (devolve em XML):

http://www.calendario.com.br/api_feriados_municipais_estaduais_nacionais.php

Tem os feriados nacionais, estaduais e municipais do Brasil. Eu gosto bastante.

@angeliski
Copy link
Member

Hey @mariofts Você pode explicar melhor a sua ideia? Fiquei confuso pois ela parece muito com o stella-feriado.

@mariofts
Copy link
Member Author

@angeliski foi esta issue q deu origem ao Stela-feriado 🙂.

Acho que vocês poderia olhar as apis feitas em java e tentar trazer pro século atual, já tem muita coisa mas tudo muito velho, verboso, configurado em xml, sem suporte a Java.time ou lambda. Acho q essa era a idéia

@angeliski
Copy link
Member

Agora tudo faz sentido @mariofts! hasuhasuhsa
Realmente, as questões de feriados são complexas. Vou deixar essa Issue aberta até conseguir abrir uma sobre a atualização do stella-feriado.
Muito obrigado pelo apoio

@edgarfroes
Copy link

Cara, a API mais simples e completa que eu conheço é desse site aqui (devolve em XML):

http://www.calendario.com.br/api_feriados_municipais_estaduais_nacionais.php

Tem os feriados nacionais, estaduais e municipais do Brasil. Eu gosto bastante.

Acho surpreendente que ninguém comentou nisso aqui. Essa API dos caras do calendario.com.br é sensacionível.

@angeliski angeliski added epic Tarefa principal de uma melhoria extensa Aceitando contribuições labels Mar 13, 2019
@opedrosoares
Copy link

Sem utilizar API, apenas cálculo matemático e a biblioteca Moment.js

function easterDay(y) {
    var c = Math.floor(y / 100);
    var n = y - 19 * Math.floor(y / 19);
    var k = Math.floor((c - 17) / 25);
    var i = c - Math.floor(c / 4) - Math.floor((c - k) / 3) + 19 * n + 15;
    i = i - 30 * Math.floor((i / 30));
    i = i - Math.floor(i / 28) * (1 - Math.floor(i / 28) * Math.floor(29 / (i + 1)) * Math.floor((21 - n) / 11));
    var j = y + Math.floor(y / 4) + i + 2 - c + Math.floor(c / 4);
    j = j - 7 * Math.floor(j / 7);
    var l = i - j;
    var m = 3 + Math.floor((l + 40) / 44);
    var d = l + 28 - 31 * Math.floor(m / 4);
    return moment([y, (m - 1), d]);
};

function getHolidaysBr(y) {
    var anoNovo = moment("01/01/"+y,"DD/MM/YYYY");
    var carnaval1 = easterDay(y).add(-48, "d");
    var carnaval2 = easterDay(y).add(-47, "d");
    var paixaoCristo = easterDay(y).add(-2, "d");
    var pascoa = easterDay(y);
    var tiradentes = moment("21/04/"+y,"DD/MM/YYYY");
    var corpusChristi =  easterDay(y).add(60, "d");
    var diaTrabalho = moment("01/05/"+y,"DD/MM/YYYY");
    var diaIndependencia = moment("07/09/"+y,"DD/MM/YYYY");
    var nossaSenhora = moment("12/10/"+y,"DD/MM/YYYY");
    var finados = moment("02/11/"+y,"DD/MM/YYYY");
    var proclamaRepublica = moment("15/11/"+y,"DD/MM/YYYY");
    var natal = moment("25/12/"+y,"DD/MM/YYYY");
    return [
        {m: anoNovo, dia: "Ano Novo", d: anoNovo.format("DD/MM/YYYY") },
        {m: carnaval1, dia: "Carnaval", d: carnaval1.format("DD/MM/YYYY") },
        {m: carnaval2, dia: "Carnaval", d: carnaval2.format("DD/MM/YYYY") },
        {m: paixaoCristo, dia: "Paix\u00E3o de Cristo", d: paixaoCristo.format("DD/MM/YYYY") },
        {m: pascoa, dia: "P\u00E1scoa", d: pascoa.format("DD/MM/YYYY") },
        {m: tiradentes, dia: "Tiradentes", d: tiradentes.format("DD/MM/YYYY") },
        {m: corpusChristi, dia: "Corpus Christi", d: corpusChristi.format("DD/MM/YYYY") },
        {m: diaTrabalho, dia: "Dia do Trabalho", d: diaTrabalho.format("DD/MM/YYYY") },
        {m: diaIndependencia, dia: "Dia da Independ\u00EAncia do Brasil", d: diaIndependencia.format("DD/MM/YYYY") },
        {m: nossaSenhora, dia: "Nossa Senhora Aparecida", d: nossaSenhora.format("DD/MM/YYYY") },
        {m: finados, dia: "Finados", d: finados.format("DD/MM/YYYY") },
        {m: proclamaRepublica, dia: "Proclama\u00E7\u00E3o da Rep\u00FAblica", d: proclamaRepublica.format("DD/MM/YYYY") },
        {m: natal, dia: "Natal", d: natal.format("DD/MM/YYYY") }
    ];
}
function getHolidayBetweenDates(date, dateTo){
    var dateStart = moment(date,"YYYY-MM-DD");
    var dateEnd = moment(dateTo,"YYYY-MM-DD");
    var datesHoliday = [];

    while (dateEnd > dateStart || dateStart.format("Y") === dateEnd.format("Y")) {
       $.merge(datesHoliday,getHolidaysBr(parseInt(dateStart.format("YYYY"))));
       dateStart.add(1,"year");
    }
    return datesHoliday;
}

var hollidays = getHolidayBetweenDates("2016-01-01","2020-01-01");

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Aceitando contribuições epic Tarefa principal de uma melhoria extensa
Projects
None yet
Development

No branches or pull requests

8 participants