O que está errado?

        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()));

Resultado também dá 2:30

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:

[code]int millis = diferenca % 1000;
diferenca = diferenca / 1000;
int secs = diferenca % 60;
diferenca = diferenca / 60;
int minutes = diferenca % 60;
diferenca = diferenca / 60;
int hours = diferenca % 60;

System.out.println(“A diferença de tempo é %d horas, %d minutos, %d segundos e %d milisegundos”, hours, minutes, secs, millis);
[/code]

Ou, ao invés de fazer tanta conta, você usa a classe Period da API Joda-Time (recomendo).

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.

Sim, é isso mesmo.

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.