Calculando horas

7 respostas
D

Pessoal, já vi muita coisa sobre calculo de horas que não deu certo pra mim.
Sou novo, talvez esteja fazendo coisa errada.

Faço um select aonde retorno a hora de entrada e saída dos funcionarios.
São 6 horas, entrada e saída de manhã, entrada e saída de tarde e entrada e saída de noite.

Eu capturo as horas via select, (hora1, hora2…) jogo para long (hora1l, hora2l…)
e tento fazer o calculo, aonde hora 1 representa entrada, hora 2 saída e assim por diante.

Meu código:

long hora1l = hora1.getTime();
            long hora2l = hora2.getTime();
            long hora3l = hora3.getTime();
            long hora4l = hora4.getTime();
            long hora5l = hora5.getTime();
            long hora6l = hora6.getTime();
            long TotalDia = ((hora2l - hora1l) + (hora4l - hora3l) + (hora6l - hora5l));
            meuobjeto.setTotal(new SimpleDateFormat("HH:mm:ss").format(new Date(TotalDia)));

Eu faço hora2l-hora1l , hora4l-hora3l e hora6l-hora5l
pois a hora de saída é maior que a hora de entrada.

As horas que usei para teste são:

hora1 = 09:00
hora2 = 12:00
hora3 = 13:00
hora4 = 18:00
hora5 = 19:00
hora6 = 22:00

O No total, me retorna 8 horas. sendo que são 11.

Não sei se o long não calcula direito ou se tenho que fazer alguma coisa antes.
Alguém tem alguma coisa que me ajude ?

Agradeço desde já.

7 Respostas

E

Infelizmente, você não pode usar SimpleDateFormat para mostrar uma diferença entre datas. Ele está mostrando para você uma outra coisa - o número de milissegundos passados desde 01/01/1970, em formato UTC. Isso vai lhe mostrar 08:00:00 em vez de 11:00:00 porque ele está considerando o fuso local (que é UTC - 03:00).

Para mostrar uma diferença entre datas, você terá de fazer contas mesmo, o que é inevitável (ou então, usar o Joda-Time).

long TotalDia = ((hora2l - hora1l) + (hora4l - hora3l) + (hora6l - hora5l));  
 // você não pode usar "new Date" para representar uma diferença entre datas. 
 meuobjeto.setTotal(new SimpleDateFormat("HH:mm:ss").format(new Date(TotalDia)));  // <- aqui o erro
D

entaglement, obrigado pela resposta.

A parte de jogar as horas de formato Time para Long, e calcular, é um procedimento correto ?
Se sim, o calculo estaria feito, pois eu calculo a diferença entre elas e mostro a soma de todas.
Eu usei o SimpleFormat date para tentar jogar para uma String e mostrar em tela para o usuário.
Teria alguma idéia de como poderia retornar este TotalDia para o usuário?

Obrigaod novamente.

E

Pois é, nesse caso em particular, se não quiser usar o Joda-Time (e se não houver uma “virada de horário de verão” também), você pode fazer do jeito que você fez (a contagem de milissegundos transcorridos está correta), e então teria de fazer algumas contas.

Digamos que você queira mostrar em horas, minutos e segundos (não dividindo em dias, que não faz sentido nesse caso - a maior unidade que você quer usar é horas).

Então você faria algo mais ou menos assim (veja se as contas que fiz estão certas, por favor) :

public static String ms2hms (long milis) {
    long segs = milis / 1000;
    long minutos;
    long horas;
    horas = segs / 3600; segs = segs % 3600;
    minutos = segs / 60; segs = segs % 60;
    return String.format ("%02d:%02d:%02d", horas, minutos, segs);
}
D

Desulpe minha ignorancia, mas aonde ele está me mostrando o número em milisegundos, sendo que ele me mostra 8:00:00 ? :frowning:

E

A variável “TotalDia” contém o valor das diferenças entre horas em milissegundos.

O método que lhe passei converte esse TotalDia para um valor que você pode mostrar (no seu caso em particular, “11:00:00” ou coisa parecida).

D

Exatamente.

Cara, você me ajudou muito. Não estava entendendo o porque, e agora sim entendi.

Obrigado de verdade.

ViniGodoy

Se você usa muito cálculo com datas, considere com carinho usar isso aqui:
http://joda-time.sourceforge.net/

Criado 16 de agosto de 2010
Ultima resposta 16 de ago. de 2010
Respostas 7
Participantes 3