[RESOLVIDO]Calcular as horas referente as duas datas, mas somente horário comercial e dias utei
7 respostas
H
Helder8
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:00StringnuHorasExecutadas=String.valueOf((int)(newDate().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?
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.
H
Helder8
Sobre os eventuais feriados, eu estava contando com alguma API que faça isso, mas caso contrário, terei que fazer na mão.
P
Polverini
eu não conheço nenhuma API pra isso mas para manipulação de datas use o JodaTime
H
Helder8
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.
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.
publicstaticintquantHorasExecutadas(DatedataInicio){finalintHORA_INICIO_COMERCIAL=9;finalintHORA_FIM_COMERCIAL=18;finalintHORAS_TRABALHADAS_NORMAL_DIA=8;finalintHORARIO_ALMOCO_LIMITE=14;//Formata as datas para StringStringdtInicio=Util.formataDataHora(dataInicio);StringdtHoje=Util.formataDataHora(newDate());//Pega as horas das datasinthoraDtInicio=Integer.parseInt(dtInicio.substring(13,dtInicio.length()-6));inthoraDtHoje=Integer.parseInt(dtHoje.substring(13,dtInicio.length()-6));//Determina a quantidade de horas que foi executadas na data de iniciointquantHorasExecutadasDtInicio=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 horaif(horaDtInicio>HORARIO_ALMOCO_LIMITE){quantHorasExecutadasDtInicio-=1;}}//Determina a quantidade de horas que foi executadas na data de hojeintquantHorasExecutadasDtHoje=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 horaif(horaDtHoje>HORARIO_ALMOCO_LIMITE){quantHorasExecutadasDtHoje-=1;}}//Determina a quantidade de horas trabalhas, pelos dias uteisintquantHorasExecutadasTotal=nuDiasExecutadosUteis(dataInicio)*HORAS_TRABALHADAS_NORMAL_DIA;//Faz a soma total das horas trabalhadasquantHorasExecutadasTotal+=quantHorasExecutadasDtInicio+quantHorasExecutadasDtHoje;returnquantHorasExecutadasTotal;}publicstaticintnuDiasExecutadosUteis(DatedataInicio){//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 uteisintnuDiasExecutados=(int)(newDate().getTime()-dataInicio.getTime())/86400000;inttotalDiasExecutadosUteis=0;Calendarcal=Calendar.getInstance();cal.setTime(dataInicio);for(inti=1;i<=nuDiasExecutados;i++){//Acrescenta mais um dia na data para poder verificar se é dia utilcal.add(Calendar.DATE,1);//Verifica se não é dia utilif(cal.get(Calendar.DAY_OF_WEEK)!=Calendar.SATURDAY&&cal.get(Calendar.DAY_OF_WEEK)!=Calendar.SUNDAY){totalDiasExecutadosUteis+=1;}}returntotalDiasExecutadosUteis;}
Sobre os feriados o DBA vai fornecer em um banco de dados, ai fica mais facil.