Como fazer a subtração do Date para o resultado esperado

Olá, estou tentendo implementar uma lógica de subtração de Date de acordo com os horários de trabalho e marcação de funcionarios. O grande problema é quando tento façar e implementar a lógica quando o horario passa de meia noite.

Consigo fazer a lógica e a diferença quando se trata do periodo de 1 dia(24). Agora quando por exemplo Horario de trabalho é 22:00 - 05:00 e horario de marcacao é 21:00 - 04:00. Tem que me retornar 04:00 - 05:00 como horairo de atraso. Mas quando passa da meia noite se trata de ouro dia. E estou tendo problemas ao implementar essa lógica. Quem souber me ajudar serei grato!

Seria basicamente o seguinte:

Exemplo :

            Tabela-Horario De Trabalho:
                    registros:
                            08:00  12:00

            Tabela-Marcacoes Feitas:
                    registros:
                            07:00 11:00

            Se chamarmos a função de subtração passando como parâmetro 1 os registros da Tabela-Horario De Trabalho e 2 os registros da Tabela-Marcacoes Feitas, a função tem que retornar os períodos da Tabela 1 menos o da tabela 2.

            Seria assim:
          
            das 08:00 às 12:00 eu devo tirar das 07:00 às 11:00, portanto fica no primeiro período 11:00 às 12:00

            Vamos analisar, 11:00 às 12:00 seria o período que o funcionário não cumpriu, então seria o atraso.

Já consegui implementar o seguinte:

// Obter parâmetros do request
            String[] tabelaHorarioParam = request.getParameterValues("tabelaHorario");
            String[] tabelaMarcacoesParam = request.getParameterValues("tabelaMarcacoes");

 / Converter os parâmetros para listas de períodos
            List<Periodo> tabelaHorario = converterStringParaLista(tabelaHorarioParam);
 
            // Calcular a subtração paraatrasos e horas extras
            List<Periodo> atrasos = calcularAtraso(tabelaHorario, tabelaMarcacoes);


private List<Periodo> converterStringParaLista(String[] array) throws ParseException {
        List<Periodo> lista = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");

        if (array != null) {
            for (String item : array) {
                String horario = item.replace("[", "").replace("]", ""); // Remover colchetes
                String[] horarios = horario.trim().split(","); // Dividir por vírgula, se necessário

                for (String periodo : horarios) {
                    String[] partes = periodo.trim().split("-");

                    if (partes.length == 2) {
                        String inicioStr = partes[0].trim().replaceFirst("\"", ""); 
                        String fimStr = partes[1].trim();

                        Date inicio = sdf.parse(inicioStr);
                        Date fim = sdf.parse(fimStr);
                        lista.add(new Periodo(inicio, fim));
                    } else {
                        throw new ParseException("Formato inválido para o período: " + periodo, 0);
                    }
                }
            }
        }

        return lista;
    }```
private List<Periodo> calcularAtraso(List<Periodo> tabelaHorario, List<Periodo> tabelaMarcacoes) {
       List<Periodo> atrasos = new ArrayList<>();
       SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");

       for (Periodo periodoTrabalho : tabelaHorario) {
           for (Periodo periodoMarcacao : tabelaMarcacoes) {
               // Verificar se há sobreposição entre os períodos
               if (periodoTrabalho.getFim().after(periodoMarcacao.getInicio()) && periodoTrabalho.getInicio().before(periodoMarcacao.getFim())) {
                   // Calcular o atraso
                   Date inicioAtraso = periodoMarcacao.getFim();
                   Date fimAtraso = periodoTrabalho.getFim();
                   Periodo atraso = new Periodo(inicioAtraso, fimAtraso);
                   atrasos.add(atraso);
               }
           }
       }

       return atrasos;
   }```

Primeiro você calcula a diferença do horário de saída para o horário de entrada, isto é, horaSaida menos horaEntrada.

Se o resultado da diferença for negativo, é sinal que virou o dia, neste caso, basta somar 24 horas para obter o período trabalhado.

Por exemplo, se fizer 05:00 menos 22:00, o resultado será -17:00.
Como é um valor negativo, você vai somar 24:00 horas.
Assim vai obter o período correto de 07:00 horas trabalhadas.

Eu já respondi em outro tópico, mas só pra deixar registrado o resumo:

Não use a antiga API de datas. Desde o Java 8 (lançado em 2014) existe a API java.time, que corrige vários problemas de Date e SimpleDateFormat.

Quanto aos horários que podem estar no dia seguinte, eu acho mais simples de resolver se considerar a data juntamente com o horário. Veja lá no outro tópico como eu resolvi, tem o código e a explicação detalhada.