[RESOLVIDO]Calcular as horas referente as duas datas, mas somente horário comercial e dias utei
7 respostas
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.
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.
Polverini
eu não conheço nenhuma API pra isso mas para manipulação de datas use o JodaTime
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.