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.