Boa tarde a todos. Estou com dificuldade para fazer cálculo com hora.
Eu tenho uma horaFinal, uma horaInicial e faço a diferença entra as duas.
Long diferenca = (horaFinal.getTime() - horaInicial.getTime());
Só que depois, quando eu tento mostrar o resultado em hora, ele mostra uma resultado absurdo.
Time time = new Time(diferenca);
O que eu pude notar é que quando eu pego o valor em milissegundos da hora, é um número de tamanho bem grande (13 casas). Mas quando eu faço a diferença
entre as duas o valor que sobra é de um tamanho pequeno (8 casas). Eu creio que o problema possa estar aí, mas não consegui resolver. Será que alguém pode
dar uma força?
Use o Calendar:
Calendar dataIni = Calendar.getInstance();
Calendar dataFim = Calendar.getInstance();
int diferançaHora = dataFim.get(Calendar.HOUR_OF_DAY) - dataIni.get(Calendar.HOUR_OF_DAY);
System.out.println(diferançaHora);
neste exemplo ele irá imprimir zero porque está instanciando as duas variáveis uma seguida da outra
então elas terão a mesma hora e a diferença será zero, mas para fazer esse tipo de cálculo é melhor
utilizar a classe Calendar
Abraço
Legal marcosharbs, já evoluí bastante. Mas agora, quando a diferença é de 10 segundos, por exemplo. ele só mostra 10, em vez
de mostrar 00:00:10. Posso usar SimpleDateFormat pra esse cara?
Só pra mostrar o que eu fiz:
Calendar c = Calendar.getInstance();
//tempoJaCalculado é a diferença (Long)
c.setTimeInMillis(tempoJaCalculado);
System.out.println("Hora já calculada: " + c.get(Calendar.HOUR_OF_DAY));
Mas não deu certo ainda.
não to entendendo
vc quer comparar as horas ou quer pegar a data em milesegundos?
vc quer diminuir duas datas e dai converter a diferença para horas?
Pegar a diferença de tempo (em HH:mm:ss) das datas e exibir.
Long diferenca = dataA.getTime() - dataB.getTime();
Eu pensei que pudesse fazer assim:
dataA - dataB;
Mas não dá :oops: (um objeto menos o outro também né… daí sai um rebosteio só)
amigo para calculos assim utiliza a JODA-TIME, o unico defeito é que nao existe doc em portugues, mas com um pouquinho de esforço vc consegue rapidamente aprender a utilizar a api
no seu caso com ela é simples:
DateTime dataInicial = new DateTime();
DateTime dataFinal = new DateTime();
Period tempoEntreAsDatas = new Period(dataInicial, dataFinal);
assim ele calcula horas, minutos e segundos como vc quer
grande abrassssssssss
Legal, achei interessante.
No meu caso, que obrigatoriamente trabalho com valores Long (pq vem long do banco), eu poderia usar a classe Duration, correto?
isso, Duration ou Period de acordo com a necessidade… um pode ser convertido no outro
abrassss
Ainda o mesmo problema. Vou descrever o que está acontecendo.
Quando eu subtraio os valores em milissegundos, obtenho o valor 10000 (10 segundos).
Mas quando preciso transformar esse valor em hora (HH:mm:ss), em vez de obter 00:00:10,
eu obtenho 21:00:10. Entra aquele 21 no lugar da hora, quando na verdade deveria ser 00:00:10.
É isso o que acontece.
vc ja esta trabalhando com a joda-time ? se sim, poste o codigo
vc quer é o intervalo entre uma data/hora e outra ? ex: das 14 horas as 18 horas = 4 horas
abrassss
Ah sim:
//neste momento, tempoJaTrabalhado é um Long de valor = 10000, ou seja, 10 segundos
Period p = new Period(tempoJaTrabalhado);
p.getHour();
Como eu fazia antes:
//neste momento, tempoJaTrabalhado é um Long de valor = 10000, ou seja, 10 segundos
Time time = new Time(tempoJaTrabalhado);
System.out.println(time);
//daí ele exibe 21:00:10, quando deveria exibir 00:00:10
o metodo eh getHours() ao inves de getHour();
mas td bem… apos a chamada esse metodo retornara 0… o que vc esperava ?
se imprimir p, ele chamara o metodo toString(), que retornara “PT10S”
caso queira imprimir 00:00:10 vc pode utilizar a classe PeriodFormatterBuilder
http://joda-time.sourceforge.net/api-release/org/joda/time/format/PeriodFormatterBuilder.html
é isso ? amigo, por favor, seja mais especifico para que possamos resolver o problema
abrasss
Criei um método que faz os cálculos a partir de um Long. Foi custoso, mas tá funcionando: transformar um long em hora corretamente. Obrigado a todos.