Boa tarde meus bons.
Pessoal surgiu uma demanda para eu fazer e não encontrei maneira eficiente para realizar a tarefa.
Eu preciso calcular os dias entre duas datas e excluir os finais de semana e os feriados, nesse caso somente os nacionais.
vou postar um código que fiz usando node.js e dessa maneira funciona.
para realizar o calculo das datas uso uma lib chamada moment-bussines-days
const moment = require('moment-business-days');
var now = new Date();
let holiDays = [
"01-01-" + now.getFullYear(), // Confraternização Universal
"21-04-" + now.getFullYear(), // Tiradentes
"22-04-" + now.getFullYear(), // Descobrimento do Brasil
"01-05-" + now.getFullYear(), // Dia do Trabalho
"07-09-" + now.getFullYear(), // Independência do Brasil
"12-10-" + now.getFullYear(), // Nsa. Sra. Aparecida
"02-11-" + now.getFullYear(), // Finados,
"15-11-" + now.getFullYear(), // Proclamação da Republica
"25-12-" + now.getFullYear(), // Natal
];
let workinghours = {
0: null,
1: ['09:00:00','18:00:00'],
2: ['09:00:00','18:00:00'],
3: ['09:00:00','18:00:00'],
4: ['09:00:00','18:00:00'],
5: ['09:00:00','18:00:00'],
6: null
};
moment.updateLocale('pt-br', {
holidays: holiDays,
holidayFormat: 'DD/MM/YYYY',
workingWeekdays: [1, 2, 3, 4, 5],
workinghours: workinghours
});
var diff = moment('01/10/2019', 'DD/MM/YYYY').businessDiff(moment('04/11/2019','DD/MM/YYYY'));
console.log(diff + ' dia(s)');
Com essa lib eu consigo excluir os feriados nacionais e fica bem adequado para meu problema.
Vou posta o código feito em java:
package br.com.datas;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Weekends {
public static void main(String[] args) {
Date dt1 = new Date();
dt1.setDate(1);
Date dt2 = new Date();
dt2.setDate(4);
dt2.setMonth(10);
long dias = days(dt1,dt2);
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(dt1.getTime()));
System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(dt2.getTime()));
System.out.println(dias);
}
private static long days(Date start, Date end){
Calendar c1 = Calendar.getInstance();
c1.setTime(start);
int w1 = c1.get(Calendar.DAY_OF_WEEK);
c1.add(Calendar.DAY_OF_WEEK, -w1);
Calendar c2 = Calendar.getInstance();
c2.setTime(end);
int w2 = c2.get(Calendar.DAY_OF_WEEK);
c2.add(Calendar.DAY_OF_WEEK, -w2);
long days = (c2.getTimeInMillis()-c1.getTimeInMillis())/(1000*60*60*24);
long daysWithoutSunday = days-(days*2/7);
return daysWithoutSunday-w1+w2;
}
}
com java com essa algorítimo também funciona, oque ele faz e calcular o intervalo entre as duas datas e excluir os dias de fim de semana, que no caso são dois dias.
Porém não vejo maneiro de adicionar o calculo dos feriados nacionais pois se um desses feriados ou futuros feriados municipais que irei adicionar no método, cair no fim de semana eu iria calcular errado pois estou tirando dois dias do resultado final, eu estava pensando de tirar dias de acordo com a quantidade de feriados, mas se o feriado cair aos fins de semana vou tirar um dia a mais sem necessidade.
Alguém sabe uma lib para java paracida com essa moment-bussines-days para java ou qualquer outra solução ?
Agradeço.