Diferença em horas

11 respostas
monike

Bom dia Galera!

To com uma dúvida aqui, to precisando calcular a diferença entre horas.Eu estava fazendo assim:
Minha data está neste formato: 2009-11-28 22:00:00

Integer diferencaHorasUteis = requisicao.getDataHoraRetornoEfetivo().getHours() - requisicao.getDataHoraSaidaEfetiva().getHours();

Mas além de estar depreciado, ele nao calcula correto,apenas se for horas redondas.Ex: 23 - 22 = 1h
Mas se for EX: 23:30 - 22 ele me calcula errado.
Pesquisei algumas coisas na net,testei mas nao deu mt certo.
Como resolvo isso???

obrigada

11 Respostas

renanreismartins

sem duvida a melhor forma de fazer estes calculos é utilizando a lib joda-time

abrassssssss

alanbrasil1984
public static int diferencaEmDias(Calendar c1, Calendar c2) {
		 
		 String c11 = TransformacoesData.dateToString(c1); // Para Fixar em 00:00 do dia vigente
		 String c22 = TransformacoesData.dateToString(c2); // ||      ||       ||         ||   
		 
		 c1 = TransformacoesData.getDataCalendar(c11);//voltando a data com 00:00
		 c2 = TransformacoesData.getDataCalendar(c22);// || || || || || || || || 
		 
		 
		 long m1 = c1.getTimeInMillis();//pega a data em milisegundos 
		 long m2 = c2.getTimeInMillis();//||    ||     ||      || 
		 		 
		 return (int) ((m2 - m1) / (24*60*60*1000)); // retorna a diferença em dias de uma data para outra.. // ao inves disso coloca assim return (int) ((m2 - m1) / (60*60*1000)); 
	 }

esse metodo verifica diferença entre 2 datas em dia para ser em horas basta apenas colocar a divisão por 60 somente...

espero ter ajudado

ViniGodoy

Você pode usar a Joda-Time:
http://www.guj.com.br/posts/list/15/96784.java#520115

Ou então, faça:
long retorno = requisicao.getDataHoraRetornoEfetivo().getTimeInMillis();
long saida =  requisicao.getDataHoraSaidaEfetiva().getTimeInMillis();

double horas = (retorno - saida) / 3600000.0;
W

2009-11-28 22:00:00 é formato de timestamp do banco não?
se for muito facil com a função

select timestampdiff(tipo, dataInicial, DataFinal);
select timestampdiff(hour, '2009-12-2 00:00:00', '2009-12-2 02:00:00')
2H

bom isso no MySQL…

monike

Obrigada a todos pela ajuda!
Eu baixei o joda-time-1.6 e joguei n a pasta lib .Mas ele pede pra mudar o .getTimeInMillis(); para TimeImpl e quando mudei pediu para renomear.
O que será que deu?

monike

Essa solução do mysql é mt boa,mas ele nao calcula se a hora for quebrada EX: 21:30 - 19:00

ViniGodoy

Aquele cálculo que eu coloquei ali em cima calcula.

monike

Ahh sim, o problema é que coloquei o .jar joda-time no meu projeto mas quando tento usar o getTimeInMillis() ele nao reconhece.

mario.fts

coloca o trecho de código aqui.

ViniGodoy

Aquele trecho, com o getTimeInMillis() é sem o Joda-Time. É com a api do calendar.
Com o Joda-Time é o programa que está no link.

Se o tipo retornado por aqueles métodos for um Date, e não um calendar, use apenas getTime() no lugar de getTimeInMillis().

W

hmm entendi, quando eu usei essa função eu precisava da diferença total de tempo, mas a base das contas eram em minutos, eu fiz assim,

fiz o select com Minute

select timestampdiff(MINUTE, dataInicial, DataFinal);

Iniciei um GregorianCalendar zerado
e adicionei os minutos a data do GregorianCalendar do proprio java, ai so dar os get em anos, meses, dias, horas, segundos…

data = new GregorianCalendar(1, 0, 1);
data.add(Calendar.MINUTE, minutos);

So atenção que o getYear, e getDay devem ter -1, se iniciar a data como 0,0,0 da uns erros meio estranhos…

public int getYear() {
    return data.get(Calendar.YEAR) - 1;
}

public int getMonth() {
    return data.get(Calendar.MONTH);
}

public int getDay() {
    return data.get(Calendar.DAY_OF_MONTH) - 1;
}

public int getHour() {
    return data.get(Calendar.HOUR_OF_DAY);
}

public int getMinute() {
    return data.get(Calendar.MINUTE);
}

assim eu consegui a diferença entre datas em qualquer medida

Criado 19 de janeiro de 2010
Ultima resposta 19 de jan. de 2010
Respostas 11
Participantes 6