Diferença entre horas

5 respostas
programaçãojava
F

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";
    }
}

5 Respostas

W

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 ));
    }
}
F

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

F

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

W

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:

F

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

Criado 1 de abril de 2017
Ultima resposta 2 de abr. de 2017
Respostas 5
Participantes 2