Date data1 = new Date();
Date data2 = new Date();
Date dataF = new Date();
DateFormat df = new SimpleDateFormat ("HH:mm");
data1.setHours(10);
data1.setMinutes(30);
data2.setHours(5);
data2.setMinutes(0);
long diferenca = data1.getTime() - data2.getTime();
dataF.setTime(diferenca);
System.out.println("data: " + df.format(dataF));
resultado tá dando 2:30
tentei com calendar
GregorianCalendar calendar = new GregorianCalendar();
GregorianCalendar calendar2 = new GregorianCalendar();
GregorianCalendar calendarAux2 = new GregorianCalendar();
calendar.set(GregorianCalendar.HOUR_OF_DAY, 10);
calendar.set(GregorianCalendar.MINUTE, 30);
calendar2.set(GregorianCalendar.HOUR_OF_DAY, 5);
calendar2.set(GregorianCalendar.MINUTE, 0);
long diferenca2 = calendar.getTimeInMillis() - calendar2.getTimeInMillis();
calendarAux2.setTimeInMillis(diferenca2);
System.out.println("Data: " + df.format(calendarAux2.getTime()));
Bom, não sei o que você esperava dessa função. Mas posso dizer o que ela não faz. Tirar a diferença em milis entre dois tempos não dá o número de horas entre eles, pelo menos, não na conversão com o format.
Cada valor representa a quantidade de milisegundos desde 1/1/1970. Subtrair os dois milis vai dar a quantidade de milisegundos entre as duas datas. Mas convertendo isso para a representação de data, você teria que calcular que dia e hora esses milis dariam a partir de 1/1/1970. Um valor que não faz muito sentido.
Se você quiser saber a quantidade horas, precisa converter esse valor através de continhas simples:
Acho que o estranho aí é que 10h30m - 5h deveria retornar 5h30min não é isso?
Eu li uma vez que o setTimeInMillis carrega os milissegundos apartir de 1/1/1970 com Time Zone GMT (Greenwich Mean Time ou algo assim), como estamos com -3 horas de fuso em relação ao GMT, ocorre essa diferença e é exibido 2h30m. Faz um tempinho que eu vi isso, então não tenho 100% de certeza.
A respeito da manipulação de datas concordo com tudo que o Vini postou. Trabalhar diretamente com Calendar ou Date é chatinho.
Veja, a diferença dos dois tempos irá dar 5 horas e meia em milisegundos. Isso transformado em Date são 5:30 de 1/1/1970 GMT. Aplicando nosso fuso, dá 2:30h da tarde, de 1/1/1970.
É importante notar que a formatação HH:MM não retorna os milis em minutos e segundos. E, sim, faz uma conversão para uma data, e mostra as horas e minutos dessa data. Tanto que se você nunca terá horas superiores a 23, usando essa função mesmo que tenha muitos milis acumulados. O que vai ocorrer é que a data vai girar para o próximo dia, e você só exibirá as horas, nesse novo dia.