Problema com Date java

Fala pessoal, tô com um problema trabalhando com datas em java:

            SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
	
	Date d1 = sdf1.parse("23/02/2021 11:00:00");
	Date d2 = sdf1.parse("24/02/2021 12:00:00");
	
	long t1 = d1.getTime();
	long t2 = d2.getTime();

	double diference = t2 - t1;
	
	System.out.println(diference / 1000 + " segundos");
	System.out.println(diference / 1000 / 60 + " minutos");
	System.out.println(diference / 1000 / 60 / 60 + " horas");

           Output:
           46800.0 segundos
           780.0 minutos
           13.0 horas

Quero calcular a diferença de tempo entre duas datas mas quando coloco esses horários (11 e 12) o resultado sai errado,

Máscaras hh representam horas no formato de 12 horas. Isso que está causando confusão no seu código.

O trecho Date d2 = sdf1.parse("24/02/2021 12:00:00") cria um objeto date com o valor 24/02/2021 00:00:00.
O que você precisa fazer é adicionar a data no formato de 24 horas. Isso pode ser feito alterando a máscara do seu SimpleDateFormat para

SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss")

HH (maiúsculo) ao invés de hh (minúsculo).

Veja na documentação de SimpleDateFormat que h minúsculo corresponde ao campo “Hour in am/pm (1-12)” (ou seja, com valores entre 1 e 12, e sem o indicador AM/PM, ele assume algum valor default - no caso, 12 é interpretado como “meia-noite”).

No caso, basta trocar para H maiúsculo, que representa as horas com valores entre 0 e 23, assim, 12 é interpretado como meio-dia:

SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

Outro detalhe é que você não está quebrando corretamente o valor. Você está pegando o total de segundos correspondente á diferença, depois o total de minutos e o total de horas. Mas na verdade você tem que pegar o total de horas, depois descontar a “sobra” e calcular o total de minutos restantes, e pegar novamente a “sobra” e pegar o total de segundos restante:

SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

Date d1 = sdf1.parse("23/02/2021 11:00:00");
Date d2 = sdf1.parse("24/02/2021 12:30:40"); // mudando o valor só para não ficar zero minutos e zero segundos de diferença

long t1 = d1.getTime();
long t2 = d2.getTime();

long diff = t2 - t1;
long horas = diff / (1000 * 3600);
diff %= 1000 * 3600; // pega o resto da divisão, assim tenho somente o "excedente" em relação as horas
long minutos = diff / 60000;
diff %= 60000;
long segundos = diff / 1000;

System.out.printf("%d horas, %d minutos e %d segundos\n", horas, minutos, segundos); // 25 horas, 30 minutos e 40 segundos

Se estiver usando Java >= 8, use a APi java.time.

Infelizmente no Java 8 ainda temos que pegar a diferença em segundos e quebrá-la:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
LocalDateTime dt1 = LocalDateTime.parse("23/02/2021 11:00:00", fmt);
LocalDateTime dt2 = LocalDateTime.parse("24/02/2021 12:30:40", fmt);
long secs = ChronoUnit.SECONDS.between(dt1, dt2);
long hours = secs / 3600;
secs %= 3600;
long minutes = secs / 60;
secs %= 60;
System.out.printf("%d horas, %d minutos e %d segundos\n", hours, minutes, secs); // 25 horas, 30 minutos e 40 segundos

Mas a partir do Java 9 é possível usar java.time.Duration, que já retorna os valores quebrados para você. Só que valores maiores que 24 horas são convertidos em dias:

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/uuuu HH:mm:ss");
LocalDateTime dt1 = LocalDateTime.parse("23/02/2021 11:00:00", fmt);
LocalDateTime dt2 = LocalDateTime.parse("24/02/2021 12:30:40", fmt);
Duration diff = Duration.between(dt1, dt2);
System.out.printf("%d dias, %d horas, %d minutos e %d segundos\n", diff.toDaysPart(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());

No caso acima, ele imprimirá “1 dias, 1 horas, 30 minutos e 40 segundos”. Mas se quiser que imprima “25 horas”, basta mudar para:

System.out.printf("%d horas, %d minutos e %d segundos\n", diff.toDaysPart() * 24 + diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());

Valeeeu! Era isso mesmo

Valeu! Pensei que o problema era no cálculo. Obrigado pelas informações também!