Diferença entre horas

Boa tarde a todos! Estou com problemas para calcular diferença entre horas, por que quando o valor é inteiro da certo, mais quando preciso da diferença quebrada, o valor não é correto por exemplo (10:00 até 12:35). Alguém poderia me ajudar? Segue meu código!

public String salvar() {

    BigDecimal horaFormat = new BigDecimal(0.00);
    BigDecimal totvlrHrCli = new BigDecimal(0.00);

    try {
        utx.begin();

        if (this.atividade.getTipoSuporte().equals("Presencial")) {

            Date horaIni = this.atividade.getEntradaPresencial();
            Date horaFim = this.atividade.getSaidaPresencial();

            float umaHora = 60 * 60 * 1000;
            float horaIniMs = horaIni.getTime();
            float horaFimMs = horaFim.getTime();
            float diff = horaFimMs - horaIniMs;
            float horas = diff / umaHora;

            horaFormat = new BigDecimal(horas);

            BigDecimal traslado = new BigDecimal(this.atividade.getTraslado());
            horaFormat = horaFormat.add(traslado);

            BigDecimal vlrHrCli = this.atividade.getValorHoraCliente();

            totvlrHrCli = horaFormat.multiply(vlrHrCli);
        }

        if (getAtividade().getId() == null) {
            this.atividade.setTotalHoras(horaFormat);
            this.atividade.setValorTotalCliente(totvlrHrCli);
            em.persist(getAtividade());
        } else {
            em.merge(this.getAtividade());
        }
        utx.commit();
        return "atividades";
    } catch (Exception e) {
        FacesMessage fm = new FacesMessage("Erro ao salvar");
        FacesContext.getCurrentInstance().addMessage("salvar", fm);
        System.out.println(e);
        return "atividade";
    }
}

Talvez a classe LocalTime seja mais adequada. Vê se te ajuda:

import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalTime;

public class Main {
    private static double valorPorHora   = 10.45;
    private static BigDecimal valorPorMinuto = new BigDecimal( valorPorHora / 60 );

    public static void main(String[] args) {
        LocalTime entrada = LocalTime.of(10, 00);
        LocalTime saida   = LocalTime.of(12, 35);
        Duration duracao  = Duration.between(entrada, saida); // este é o tempo que o cliente permaneceu

        BigDecimal minutosEmBigDecimal = new BigDecimal( duracao.toMinutes() );

        System.out.println("Valor proporcional a quantidade de minutos: " + valorPorMinuto.multiply( minutosEmBigDecimal ));
    }
}

Olá! Excelente exemplo, obrigado. Mais estou percebendo que está dando uma diferença quando converto pra long

Como apresento essa duracao? Porque no banco ele grava como longblob

Nunca pensei nisso, mas fiz uma pesquisa rápida e uma possivel solução é converter pra uma String antes de armazenar.

Achei 3 links que podem ser úteis:

então consegui, trabalho sempre com minutos, e salvo no banco de dados como long. Quando preciso apresentar eu converto.

1 curtida