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

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