[RESOLVIDO]Calcular as horas referente as duas datas, mas somente horário comercial e dias utei

7 respostas
H

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

7 Respostas

D

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

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

eu não conheço nenhuma API pra isso mas para manipulação de datas use o JodaTime

H

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.

P

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.

H

Nossa cara que daora, vou analisar.

H

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

Criado 3 de maio de 2011
Ultima resposta 4 de mai. de 2011
Respostas 7
Participantes 3