Subtrair uma hora de outra?

Estou tentando subtrair uma hora de outra, para encontrar a diferença.

Exemplo:

09:00:00 - 07:00:00 = 02:00:00

Meu código é o seguinte:

public String salvar() {
    if (!validate()) {  return "atividade";  }
    try {
        utx.begin();
        long totalHoras = (long) (this.atividade.getSaidaPresencial().getTime()  - 
                          this.getAtividade().getEntradaPresencial().getTime() / 
                          (double) (1000 * 60 * 60));

        Time th = new Time(totalHoras);

        if (getAtividade().getId() == null) {
            this.atividade.setTotalHoras(th);
            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";
    }
}

Os campos estão como TIME no banco, eu subtraio uma hora da outra e gravo em outro campo de TIME.

Como resolver esse problema?

1 curtida

Olá,
este post está quase perfeito. Vc colocou seu objetivo e um código que supostamente era para funcionar, PORÉM esqueceu de mencionar qual seu problema com isto.

Mas já para tentar ajudar, o código abaixo não me parece correto:
long totalHoras = (long) (this.atividade.getSaidaPresencial().getTime() - this.getAtividade().getEntradaPresencial().getTime() / (double) (1000 * 60 * 60));

Lembre-se que na matemática divisão é feita antes que a subtração e na programação não é diferente. Se vc quer antes subtrair e depois fazer a divisão, use parenteses separando a subtração da divisão.

long totalHoras = (long) (this.atividade.getSaidaPresencial().getTime() - this.getAtividade().getEntradaPresencial().getTime()) / (double) (1000 * 60 * 60);

1 curtida

Meu problema que no banco está gravando um valor totalmente diferente. O que eu preciso é o seguinte:

hora inicio: 10:00
hora fim: 12:00
Diferença: 02:00
1 curtida

Pelo q eu vi você não está subtraindo uma hora de outra, você esta apenas calculando a diferença, para retirar 1 hora é assim:

Calendar d = Calendar.getInstance();

d.setTime(horaAserRetirada);
d.add(Calendar.HOUR, -1);
2 curtidas

Não entendi, por que o -1? se eu preciso subtrair uma hora da outra.

1 curtida

a função add do calendar tanto ele pode adicionar quanto tirar “horas, minutos, segundos, dias etc…” o “-1” é pq usando o Calendar.HOUR ele vai tirar uma hora da hora que vc setar no setTime

Estou com um pouco de dificuldade de entender, vamos lá: Eu possuo horaInicio e horaFim e preciso subtrair a horaInicio da horaFim como ficaria?

public class Teste {
    public static void main(String[] args) {
        
        Calendar cal = Calendar.getInstance();
        Date horaIni = cal.getTime();
        cal.add(Calendar.HOUR, 10);
        Date horaFim = cal.getTime();
        
        /*
         * As datas podem vir do banco de dados, do usuário, etc
         * */
        
        long umaHora = 1000 /*ms*/ * 60 /*s*/ * 60 /*m*/;
        long horaIniMs = horaIni.getTime();
        long horaFimMs = horaFim.getTime();

        long diff = horaFimMs - horaIniMs;

        long horas = diff/umaHora;
        
        System.out.println(horas + " horas");
    }
}

Como o @Rodrigo_Void disse, faltou você dizer qual o problema que está vendo.

Um dos problemas que vejo é esse aqui:

Você está passando a diferença de horas pra criar o Time, mas o time espera o número de milisegundos desde 01/01/1970 00:00

Tome cuidado que quando você subtrai uma data de outra, você nao tem um Date, você tem a duraçao entre os dois eventos, que em java pode ser calculado assim:

Duration.between(atividade.getEntradaPresidencial.toInstant(), 
      atividade.getSaidaPresidencial.toInstant())

Para armazenar essa duraçao no banco talvez seja melhor usar a quantidade de horas ou minutos ou segundos que o evento durou. O objeto Duration que você tem acima tem métodos para você obter o valor que desejar.

1 curtida

Com java 8, utilizando a nova API de datas, você conseguirá assim:

LocalTime horaInicio = LocalTime.parse("10:00:00");
LocalTime horaFim = LocalTime.parse("12:00:00");

Duration diferenca = Duration.between(horaInicio, horaFim);
LocalTime localTimeDiferenca = LocalTime.ofNanoOfDay(diferenca.toNanos());
System.out.println(localTimeDiferenca); // 02:00
1 curtida

Baseado nisso eu uso TIME ou TIMESTAMP

Consegui, mais quando a hora dá quebrada ? por exemplo 1:45

Com a nova API do java 8 (se já tiver usando), horas quebradas já são tratadas.