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