Preciso pegar uma data final e subtrair de uma data inicial para saber a diferença entre elas em HORAS, MINUTOS e SEGUNDOS, estou usando o código abaixo mas não está me retornando um resultado correto, o que está errado?
if (calPrevisaoAnterior != null) {
// fazer: Previsao do anterior - inicio do proximo, ver quanto tempo tem
System.out.println("Tempos: " + new SimpleDateFormat("dd/MM/yyy HH:mm:ss").format(calPrevisaoAnterior.getTime()) + " - " + new SimpleDateFormat("dd/MM/yyy HH:mm:ss").format(calInicio.getTime()));
long diferenca = calPrevisaoAnterior.getTimeInMillis() - calInicio.getTimeInMillis();
Calendar calDiferenca = new GregorianCalendar();
calDiferenca.setTimeInMillis(diferenca);
int hora = calDiferenca.get(Calendar.HOUR);
int min = calDiferenca.get(Calendar.MINUTE);
int seg = calDiferenca.get(Calendar.SECOND);
System.out.println("Diferenca: "+hora+"h, "+min+"m "+seg+"s");
System.out.println("");
}
Isso roda dentro de um whilte, segue algumas entradas e alguns resultados:
Parece que sua intenção foi boa, mas acho que não vai dar…
Pense um pouco comigo: se tenho duas datas cuja diferença seja de apenas 3 dias, a diferença será de 259200000 milissegundos. Se você usar o método setTimeInMillis obterá uma nova data que vale 259200000 milissegundos corridos A PARTIR DE 01/01/1970 00:00:00.000 GMT. Isso quer dizer que o resultado será uma data totalmente absurda!
Seguindo esse pensamento, a diferença entre duas datas iguais (no caso zero) retornará a data 01/01/1970 00:00:00.000 GMT, que influenciada pelo TimeZone pode retornar resultados inesperados…
Com isso, fica bem claro que a diferença entre datas fica inviável dessa forma, Mas como você está usando apenas as horas, minutos e segundos, talvez ainda haja solução (cuidado com o TimeZone!!!).
public Tempo getTempo(long tempoMilisegundos) {
Tempo tempo = new Tempo();
long dias = tempoMilisegundos / 86400000;
if (dias > 0) {
tempoMilisegundos -= dias * 86400000;
}
int horas = (int) tempoMilisegundos / 3600000;
if (horas > 0) {
tempoMilisegundos -= horas * 3600000;
}
int minutos = (int) tempoMilisegundos / 60000;
if (minutos > 0) {
tempoMilisegundos -= minutos * 60000;
}
int segundos = (int) tempoMilisegundos / 1000;
if (segundos > 0) {
tempoMilisegundos -= segundos * 1000;
}
tempo.setDias((int) dias);
tempo.setHoras((int) horas);
tempo.setMinutos((int) minutos);
tempo.setSegundos((int) segundos);
return tempo;
}
Calcular:
[code]Calendar calendarioUltimaData = new GregorianCalendar(2009, 1, 5, 14, 10, 0);
Calendar calendarioPrimeiraData = new GregorianCalendar(2009, 1, 5, 12, 25, 0);
System.out.println("Data Final…: " + new SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).format(calendarioUltimaData.getTime()));
System.out.println("Data Inicial: " + new SimpleDateFormat(“dd/MM/yyyy HH:mm:ss”).format(calendarioPrimeiraData.getTime()));
long dataMaiorLong = calendarioUltimaData.getTimeInMillis();
long dataMenorLong = calendarioPrimeiraData.getTimeInMillis();
long diferencaLong = dataMaiorLong - dataMenorLong;