Diferença entre horas

O código abaixo a gente calcula as horas e os minutos do seu horário de trabalho do dia:

if(!txtSaidaManha.getText().isEmpty() && !txtEntradaManha.getText().isEmpty()){
            inicio = sdf1.parse(txtSaidaManha.getText());
            fim = sdf1.parse(txtEntradaManha.getText());
            entradamanha = new DateTime(fim);
            saidamanha = new DateTime(inicio);
            horasmanha = Hours.hoursBetween(entradamanha, saidamanha).getHours();
            horasmanha = horasmanha % 24;
            minutosmanha = Minutes.minutesBetween(entradamanha, saidamanha).getMinutes();
            minutosmanha = minutosmanha % 60;
        }
        if(!txtSaidaTarde.getText().isEmpty() && !txtEntradaTarde.getText().isEmpty()){
            inicio = sdf1.parse(txtSaidaTarde.getText());
            fim = sdf1.parse(txtEntradaTarde.getText());
            saidatarde = new DateTime(inicio);
            entradatarde = new DateTime(fim);
            horastarde = Hours.hoursBetween(entradatarde, saidatarde).getHours();
            horastarde = horastarde % 24;
            minutostarde = Minutes.minutesBetween(entradatarde, saidatarde).getMinutes();
            minutostarde = minutostarde % 60;
        }
        if(!txtSaidaNoite.getText().isEmpty() && !txtEntradaNoite.getText().isEmpty()){
            inicio = sdf1.parse(txtSaidaTarde.getText());
            fim = sdf1.parse(txtEntradaTarde.getText());
            saidanoite = new DateTime(inicio);
            entradanoite = new DateTime(fim);
            horasnoite = Hours.hoursBetween(entradanoite, saidanoite).getHours();
            horasnoite = horasnoite % 24;
            minutosnoite = Minutes.minutesBetween(entradanoite, saidanoite).getMinutes();
            minutosnoite = minutosnoite % 60;
        }
        horastotal = horasmanha + horasnoite + horastarde;
        minutostotal = minutosmanha + minutosnoite + minutostarde;
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(sdf.parse(txtDia.getText()));
        new FichaPontoDAO().atualizarHorario(ficha.getIdcolaborador().getId(), cal, horastotal, minutostotal);

No método abaixo está o método atualizarHorario que verifica que o colaborador trabalhou a mais ou menos de acordo com a carga horária dele:

public void atualizarHorario(int idcolaborador, GregorianCalendar data, int horas, int minutos){
        EntityManager manager = getEntityManager();
        int diadasemana, hora=0, min=0;
        Date cargahoraria = null, dt1;
        long horafalta, horaextra, result;
        DateTime dt;
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        GregorianCalendar cal = new GregorianCalendar();
        Calendar cl = Calendar.getInstance();
        cl.set(cl.HOUR_OF_DAY, horas);
        cl.set(cl.MINUTE, minutos);
        cl.set(cl.SECOND, 0);
        cl.set(cl.MILLISECOND, 0);
        cl.set(cl.YEAR, data.YEAR);
        cl.set(cl.MONTH, data.MONTH);
        cl.set(cl.DAY_OF_YEAR, data.DAY_OF_YEAR);
        dt1 = cl.getTime();
        diadasemana = data.get(Calendar.DAY_OF_WEEK);
        if(diadasemana==1){
            Query consulta = manager.createQuery("select cargahorariadomingo from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else if(diadasemana==2){
            Query consulta = manager.createQuery("select cargahorariasegunda from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else if(diadasemana==3){
            Query consulta = manager.createQuery("select cargahorariaterca from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else if(diadasemana==4){
            Query consulta = manager.createQuery("select cargahorariaquarta from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else if(diadasemana==5){
            Query consulta = manager.createQuery("select cargahorariaquinta from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else if(diadasemana==6){
            Query consulta = manager.createQuery("select cargahorariasexta from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }else{
            Query consulta = manager.createQuery("select cargahorariasabado from Escala");
            cargahoraria = (Date) consulta.getSingleResult();
        }
        DateTime carga = new DateTime(cargahoraria);
        dt = new DateTime(dt1);
        hora = Hours.hoursBetween(carga, dt).getHours()%24;
        min = Minutes.minutesBetween(carga, dt).getMinutes()%60;
    }

Só se o colaborador trabalha 07:00 horas em um dia com carga horária de 08:00 o resultado dessa linha:

hora = Hours.hoursBetween(carga, dt).getHours()%24;

não teria que ser -1? Só que está dando 23. Qual o motivo desse erro?

voce passa por parametro dois inteiros,

int horas, int minutos;

que é o total de horas e minutos obtidos calculando horaManha,horaTarde,HoraNoite.

Voce recupera do banco a carga horaria em forma de “Date” que o cidadao tem que trabalhar…

Entao desse date, voce pega horas e minutos

acredito que entao basta fazer um menos o outro…

como seu proprio ex:

horaParametro - horaCarga = horaExtra || horaFalta || cargaCompleta

7-8 = -1