Ola Pessoal,
Preciso calcular a diferença de horas de duas datas, mas com as seguintes observações abaixo:
- Somente horário comercial, ou seja, 8 horas por dia;
- Apenas dias úteis.
Para calcular a quantidade de horas de duas datas estou fazendo assim:
//Retorna a quantidade de horas que foram executadas, da data inicio até a data de hoje, observação: A data inicio está vindo do banco da seguinte forma: 04/04/2011 13:00
String nuHorasExecutadas = String.valueOf((int)(new Date().getTime() - devDetalheDAO.getDtInicio().getTime()) / 3600000).replace("-", "");
Mas eu preciso implementar somente calcular horário comercial e dias uteis. Alguém sabe se tem algum .jar que faça isso, ou até mesmo uma API?
Obrigado,
Helder
Bom, como vai desconsiderar eventuais feriados?
No caso, eu faria o seguinte, calcularia os dias úteis, desse total, tiraria apenas as horas do horário comercial.
Não conheço nenhuma API ou classe que faça isso.
Sobre os eventuais feriados, eu estava contando com alguma API que faça isso, mas caso contrário, terei que fazer na mão.
eu não conheço nenhuma API pra isso mas para manipulação de datas use o JodaTime
Vou entender como usa o JodaTime, mas enquanto isso, se alguem tiver alguma idéia de como eu possa fazer isso, fique a disposição.
Por enquanto obrigado.
cara eu achei esse código para dia util
http://www.guj.com.br/java/13522-dias-uteis-em-java .
Porém não pega os feriados, provavelmente terão que ser cadastrados em um banco ou arquivo.
Nossa cara que daora, vou analisar.
Ae pessoal, resolvi o problema.
Vou postar aqui, caso alguem passa por essa mesma duvuda que eu.
Obs: a dataInicio já está cadastrada no banco de dados, assim eu só preciso pegar a data atual, caso alguem precisa de duas datas, só alterar no código e está tudo certo.
public static int quantHorasExecutadas (Date dataInicio){
final int HORA_INICIO_COMERCIAL = 9;
final int HORA_FIM_COMERCIAL = 18;
final int HORAS_TRABALHADAS_NORMAL_DIA = 8;
final int HORARIO_ALMOCO_LIMITE = 14;
//Formata as datas para String
String dtInicio = Util.formataDataHora(dataInicio);
String dtHoje = Util.formataDataHora(new Date());
//Pega as horas das datas
int horaDtInicio = Integer.parseInt(dtInicio.substring(13, dtInicio.length()-6));
int horaDtHoje = Integer.parseInt(dtHoje.substring(13, dtInicio.length()-6));
//Determina a quantidade de horas que foi executadas na data de inicio
int quantHorasExecutadasDtInicio = 0;
if (horaDtInicio <= HORA_FIM_COMERCIAL &&
horaDtInicio >= HORA_INICIO_COMERCIAL) {
quantHorasExecutadasDtInicio = horaDtInicio - HORA_INICIO_COMERCIAL;
//Verifica se foi feito a hora de almoço, para poder retirar uma hora
if (horaDtInicio > HORARIO_ALMOCO_LIMITE) {
quantHorasExecutadasDtInicio -= 1;
}
}
//Determina a quantidade de horas que foi executadas na data de hoje
int quantHorasExecutadasDtHoje = 0;
if (horaDtHoje <= HORA_FIM_COMERCIAL &&
horaDtHoje >= HORA_INICIO_COMERCIAL) {
quantHorasExecutadasDtHoje = horaDtHoje - HORA_INICIO_COMERCIAL;
//Verifica se foi feito a hora de almoço, para poder retirar uma hora
if (horaDtHoje > HORARIO_ALMOCO_LIMITE) {
quantHorasExecutadasDtHoje -= 1;
}
}
//Determina a quantidade de horas trabalhas, pelos dias uteis
int quantHorasExecutadasTotal = nuDiasExecutadosUteis (dataInicio) * HORAS_TRABALHADAS_NORMAL_DIA;
//Faz a soma total das horas trabalhadas
quantHorasExecutadasTotal += quantHorasExecutadasDtInicio + quantHorasExecutadasDtHoje;
return quantHorasExecutadasTotal;
}
public static int nuDiasExecutadosUteis (Date dataInicio) {
//Numero de dias que se passaram, sem contar com a data inicio e data fim
//Observação: Contando que a data inicio e data fim sejam dias uteis
int nuDiasExecutados = (int) (new Date().getTime() - dataInicio.getTime()) / 86400000;
int totalDiasExecutadosUteis = 0;
Calendar cal = Calendar.getInstance();
cal.setTime(dataInicio);
for (int i = 1; i<= nuDiasExecutados ; i++){
//Acrescenta mais um dia na data para poder verificar se é dia util
cal.add(Calendar.DATE, 1);
//Verifica se não é dia util
if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) {
totalDiasExecutadosUteis +=1;
}
}
return totalDiasExecutadosUteis;
}
Sobre os feriados o DBA vai fornecer em um banco de dados, ai fica mais facil.
Abs,
Helder