Galera, desculpe encher o saco com uma coisa que provavelmente muitos já devem ter perguntado, mas é que realmente não consigo resolver este problema. Eu, por conta própria, me interei com a classe Date e fiz algumas coisas interessantes em meu programa, mas eu não consigo, de jeito nenhum, realizar a subtração de 2 horários (Horas:Minutos). Exemplo: 14:30 - 12:50 = 01:40. Acho que tem que ser usada a classe Calendar, mas não consigo de jeito nenhum trabalhar com ela. Alguém pode me ajudar?? Valeu!!!
Calendar/Date
13 Respostas
Pra trabalhar com o GregorianCalendar você deve setar e pegar os dados assim
GregorianCalendar gc = new GregorianCalendar();
int diaHoje = gc.get(GregorianCalendar.DATE);//Retorna o dia
int mes = gc.get(GregorianCalendar.MONTH);//lembre-se que o mês começa do 0 então novembro é o mes 10 enão 11
int ano = gc.get(GregorianCalendar.YEAR);//Retorna o ano com quatro digitos ex: 2007
Para dias de semana e etc é só usar o get() com as constantes de GregorianCalendar que você consegue
Acho que isto resolve (usando Calendar):
public Calendar subtraiCalendar(Calendar cal1, Calendar cal2) {
cal1.add(Calendar.HOUR_OF_DAY, -1 * cal2.get(Calendar.HOUR_OF_DAY));
cal1.add(Calendar.MINUTE, -1 * cal2.get(Calendar.MINUTE));
return cal1;
}
Boa sorte!
Putz, agora eu fiquei em dúvida… Tudo bem, terei que então trabalhar com Calendar, mas e o código que já fiz com Date, não tem como converter para Calendar??? Terei que alterar todo o programa???
Opa opa, por acaso faço isso com o setTime da classe GregorianCalendar???
Nossa, eu fiz uma confusão aqui hauauahua Será que alguém pode me explicar por que no código abaixo o horaGasto não é horaSaida - horaEntrada ???
public boolean calculaValor (List lista) {
GregorianCalendar horaEntrada = new GregorianCalendar();
GregorianCalendar horaSaida = new GregorianCalendar();
GregorianCalendar horaGasto = new GregorianCalendar();
Date horarioEntrada = new Date();
Date horarioSaida = new Date();
Date horarioGasto = new Date();
horarioEntrada.setHours(this.horaEntrada);
horarioEntrada.setMinutes(this.minutoEntrada);
horarioSaida.setHours(this.horaSaida);
horarioSaida.setMinutes(this.minutoSaida);
horaEntrada.setTime(horarioEntrada);
horaSaida.setTime(horarioSaida);
horaGasto.add(horaSaida.HOUR_OF_DAY, -1 * horaEntrada.HOUR_OF_DAY);
horaGasto.add(horaSaida.MINUTE, -1 * horaEntrada.MINUTE);
JOptionPane.showMessageDialog(null, "Horario Entrada " + horaEntrada.getTime());
JOptionPane.showMessageDialog(null, "Horario Saida: " + horaSaida.getTime());
JOptionPane.showMessageDialog(null, "Horario Gasto " + horaGasto.getTime());
}
Galera, desculpe se estou sendo chato, mas realmente apreciaria se alguém pudesse me ajudar nesta questão.
Gostaria também de dar como sugestão que, sempre que determinado tópico for resolvido ou finalizado, acrescentar ao título do tópico “(Resolvido)”.
O seu erro foi não ter reparado que o método add() é void. Ele altera o calendar que o invoca. Você o invocou com a variável horaGasto, que não foi inicializada. Por isso deve ter dado um valor sem sentido.
Sugestão:
public boolean calculaValor (List lista) {
Calendar horaEntrada = Calendar.getInstance();
horaEntrada.set(Calendar.HOUR_OF_DAY, this.horaEntrada);
horaEntrada.set(Calendar.MINUTE, this.minutoEntrada);
Calendar horaSaida = Calendar.getInstance();
horaSaida.set(Calendar.HOUR_OF_DAY, this.horaSaida);
horaSaida.set(Calendar.MINUTE, this.minutoSaida);
Calendar horaGasto = Calendar.getInstance();
horaGasto.setTime(horaSaida.getTime());
horaGasto.add(Calendar.HOUR_OF_DAY, -1 * horaEntrada.get(Calendar.HOUR_OF_DAY));
horaSaida.add(Calendar.MINUTE, -1 * horaEntrada.get(Calendar.MINUTE));
JOptionPane.showMessageDialog(null, "Horario Entrada " + horaEntrada.getTime());
JOptionPane.showMessageDialog(null, "Horario Saida: " + horaSaida.getTime());
JOptionPane.showMessageDialog(null, "Horario Gasto " + horaGasto.getTime());
}
Boa sorte.
ziegfried, fiz o que você pediu, mas não resolveu… Eu inicializei a variável horaGasto com o método horaGasto.clear(). Imprimi o valor deste e realmente está zerado. No entanto, a conta final continua errada… Ele me exibe um horário sem sentido algum. Veja se consegue me ajudar, por favor. Segue abaixo o código:
if (horarioEntrada.before(horarioSaida)) {
Calendar horaEntrada = Calendar.getInstance();
Calendar horaSaida = Calendar.getInstance();
Calendar horaGasto = Calendar.getInstance();
horaEntrada.setTime(horarioEntrada);
horaSaida.setTime(horarioSaida);
horaGasto.clear();
horaGasto.add(horaSaida.HOUR_OF_DAY, -1 * horaEntrada.HOUR_OF_DAY);
horaGasto.add(horaSaida.MINUTE, -1 * horaEntrada.MINUTE);
JOptionPane.showMessageDialog(null, "Horario Entrada: " + horaEntrada.getTime());
JOptionPane.showMessageDialog(null, "Horario Saida: " + horaSaida.getTime());
JOptionPane.showMessageDialog(null, "Horario Gasto: " + horaGasto.getTime());
}
Algumas correções:
public boolean calculaValor (List lista) {
Calendar horaEntrada = Calendar.getInstance();
horaEntrada.set(Calendar.HOUR_OF_DAY, this.horaEntrada);
horaEntrada.set(Calendar.MINUTE, this.minutoEntrada);
Calendar horaSaida = Calendar.getInstance();
horaSaida.set(Calendar.HOUR_OF_DAY, this.horaSaida);
horaSaida.set(Calendar.MINUTE, this.minutoSaida);
// horaGasto deve receber o mesmo valor de horaSaida
Calendar horaGasto = Calendar.getInstance();
horaGasto.setTime(horaSaida.getTime());
// Correções nessas linhas
horaGasto.add(Calendar.HOUR_OF_DAY, -1 * horaEntrada.get(Calendar.HOUR_OF_DAY));
horaSaida.add(Calendar.MINUTE, -1 * horaEntrada.get(Calendar.MINUTE));
JOptionPane.showMessageDialog(null, "Horario Entrada " + horaEntrada.getTime());
JOptionPane.showMessageDialog(null, "Horario Saida: " + horaSaida.getTime());
JOptionPane.showMessageDialog(null, "Horario Gasto " + horaGasto.getTime());
}
Cara… não é pra inicializar horaGasto com qualquer valor não, e sim com o mesmo valor de horaSaida. O método add(int prop, int value) modifica o calendar que o invoca. Por isso ele deve ser inicializado com o mesmo valor da horaSaida, pois no add() ele é subtraído da horaEntrada e se modifica.
Aeee funcinou, aeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee!!!
O erro mais grave que eu estava cometendo era digitar :
horaGasto.add(Calendar.HOUR_OF_DAY, -1 * horaEntrada..HOUR_OF_DAY);
ao invés de:
horaGasto.add(Calendar.HOUR_OF_DAY, -1 * horaEntrada.get(Calendar.HOUR_OF_DAY));
Valeu ziegfried, muito obrigado!!!
erro estupido neh amigo , mas usa o gregoriancalendar, :lol:
Pelo que pesquisei, GregorianCalendar é uma subclasse da Calendar. Dei uma lida na na info dele, mas pelo que vi ele engloba Gregorian e Julian Calendar… Mas até aih, não vi vantagem nenhuma… Inclusive, ele tem menos métodos que a Calendar… Qual a vantagem de usar Gregorian ao invés de Calendar??
Se GregorianCalendar herda de Calendar, só pode ter o mesmo número ou mais métodos que Calendar, cara!
Os métodos são herdados, e terão os mesmos comportamentos dos de Calendar, desde que não sobrescritos.