Olá pessoal,
estou precisando fazer diferença entre horas. Por exemplo: 11:30 - 08:00 tem que dar 03:30 só que não consigo fazer isso.
Alguém tem alguma sugestão?
Vlw pela ajuda.
Olá pessoal,
estou precisando fazer diferença entre horas. Por exemplo: 11:30 - 08:00 tem que dar 03:30 só que não consigo fazer isso.
Alguém tem alguma sugestão?
Vlw pela ajuda.
Como você tentou fazer?
Esse é um problema complexo, tem que avaliar fuso horário, dias diferentes, coisas assim.
Fiz assim:
Calendar cal = new GregorianCalendar();
Calendar cal1 = new GregorianCalendar();
cal.setTime(sdf1.parse(txtSaidaManha.getText()));
cal1.setTime(sdf1.parse(txtEntradaManha.getText()));
data1 = (cal.getTime() - cal1.getTime())/(1000*60*60);
Tentei desse jeito.
sua conta parece certa pra mim, o que ele está retornando? Você poderia nos dar um exemplo dos dados setados em cal e cal1?
esqueci de escrever que esta linha errada:
data1 = (cal.getTime() - cal1.getTime())/(1000*60*60);
como ficaria ela?
como assim? essa linha vai te retornar o valor, em horas, da diferença entre as datas
aparece a seguinte mensagem:
bad operand types for binary operator ‘-’. first type: Date. second type: Date.
isso que está aparecendo.
Cara, na boa, usa JodaTime… é uma lib que contém vários métodos como Days.daysBetween(d1,d2) Hours.daysBetween(d1,d2)
Data em java é uma coisa um tanto quanto complicada. Na minha opinião a Classe Calendar deveria ter MUITO mais métodos para auxiliar no tratamento de datas como cálculos, diferenças e por ai vai, já que ela veio como um “aprimoramento” do Date, mas… para isso tempos libs alternativas.
O único problema ao meu ver é que na minha experiência com essa lib, é que ela é um pouco lenta, tirando isso show de bola.
***Só para constar… está dando erro no ser código pq cal.getTime() retorna um objeto Date. Para obter o long faça assim:
cal.getTime().getTime()
Você pode fazer a conta manualmente como fez ou usar uma biblioteca como o rockcentauro sugeriu.
[quote=ViniciusGallo]aparece a seguinte mensagem:
bad operand types for binary operator ‘-’. first type: Date. second type: Date.
isso que está aparecendo.[/quote]
E o erro é bem claro: getTime retorna um Date e Java não permite sobrecarga de operadores, ou seja, não há como subtrair dois objetos Date. Você deve usar o método getTimeInMillis em vez disso.
Lembrando que você também pode usar uma API de verdade como o Joda Time ou a nova API de datas do Java 8.
Estou usando os métodos da API jodatime. As horas estão vindo certo mas não consigo pegar os minutos restantes, por exemplo:
eu tenho uma hora de 11:30 e outra 08:00 eu quero pegar os 30 minutos, como faz isso? Estou conseguindo pegar a diferença nas horas. Abaixo mostro como estou fazendo:
inicio = new LocalTime(sdf1.parse(txtSaidaManha.getText()));
fim = new LocalTime(sdf1.parse(txtEntradaManha.getText()));
periodo = new Period(fim, inicio);
horas = Hours.hoursBetween(inicio, fim);
minutos = Minutes.minutesBetween(inicio, fim);
Alguma sugestão?
Bom dia,
Tente adaptar o que voce precisa atraves desse tutotial:
http://www.mkyong.com/java/how-to-calculate-date-time-difference-in-java/
Eu segui o link que o campelo.m passou não consigo pegar os minutos faltantes das horas 11:30 e 08:00. Abaixo está o código como fiz:
inicio = sdf1.parse(txtSaidaManha.getText());
fim = sdf1.parse(txtEntradaManha.getText());
entradamanha = new DateTime(fim);
saidamanha = new DateTime(inicio);
horasmanha = Hours.hoursBetween(saidamanha, entradamanha).getHours();
horasmanha = horasmanha % 24;
minutosmanha = Minutes.minutesBetween(saidamanha, entradamanha).getMinutes();
A ultima linha traz 180 minutos, o q deveria trazer 30 minutos.
Como faço isso?
Pessoal, peço desculpas, pois a ultima postagem está correto o código era eu que não estava vendo os dados de entrada corretamente.
Então a solução para esse erro é:
inicio = sdf1.parse(txtSaidaManha.getText());
fim = sdf1.parse(txtEntradaManha.getText());
entradamanha = new DateTime(fim);
saidamanha = new DateTime(inicio);
horasmanha = Hours.hoursBetween(entradamanha, saidamanha).getHours();
horasmanha = horasmanha % 24;
minutosmanha = Minutes.minutesBetween(entradamanha, saidamanha).getMinutes();
minutosmanha = minutosmanha % 60;
Obrigado pela ajuda.
Mas agora estou com outro problema. Eu consigo as horas e os minutos que são inteiros através disso:
if(!txtSaidaManha.getText().isEmpty() && !txtEntradaManha.getText().isEmpty()){
inicio = sdf1.parse(txtSaidaManha.getText());
fim = sdf1.parse(txtEntradaManha.getText());
entradamanha = new DateTime(fim);
saidamanha = new DateTime(inicio);
horasmanha = Hours.hoursBetween(entradamanha, saidamanha).getHours();
horasmanha = horasmanha % 24;
minutosmanha = Minutes.minutesBetween(entradamanha, saidamanha).getMinutes();
minutosmanha = minutosmanha % 60;
}
if(!txtSaidaTarde.getText().isEmpty() && !txtEntradaTarde.getText().isEmpty()){
inicio = sdf1.parse(txtSaidaTarde.getText());
fim = sdf1.parse(txtEntradaTarde.getText());
saidatarde = new DateTime(inicio);
entradatarde = new DateTime(fim);
horastarde = Hours.hoursBetween(entradatarde, saidatarde).getHours();
horastarde = horastarde % 24;
minutostarde = Minutes.minutesBetween(entradatarde, saidatarde).getMinutes();
minutostarde = minutostarde % 60;
}
if(!txtSaidaNoite.getText().isEmpty() && !txtEntradaNoite.getText().isEmpty()){
inicio = sdf1.parse(txtSaidaTarde.getText());
fim = sdf1.parse(txtEntradaTarde.getText());
saidanoite = new DateTime(inicio);
entradanoite = new DateTime(fim);
horasnoite = Hours.hoursBetween(entradanoite, saidanoite).getHours();
horasnoite = horasnoite % 24;
minutosnoite = Minutes.minutesBetween(entradanoite, saidanoite).getMinutes();
minutosnoite = minutosnoite % 60;
}
horastotal = horasmanha + horasnoite + horastarde;
minutostotal = minutosmanha + minutosnoite + minutostarde;
new FichaPontoDAO().atualizarHorario(ficha.getIdcolaborador().getId(), txtDia.getText().isEmpty()?null:sdf.parse(txtDia.getText()), horastotal, minutostotal);
O método atualizarHorario verifica se vou acrescentar hora na falta ou como extra ou não. Isso depende da cargahoraria de cada dia. Só que como faço para comparar entre as horas da carga horária e a hora que foi passado como parâmetro em inteiro (hora e minutos). O método está abaixo:
public void atualizarHorario(int idcolaborador, Date data, int horas, int minutos){
EntityManager manager = getEntityManager();
int diadasemana;
Date cargahoraria = null;
long horafalta, horaextra, result;
DateTime dt = new DateTime();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
GregorianCalendar cal = new GregorianCalendar();
cal.set(horas, minutos);
cal.setTime(data);
diadasemana = cal.get(Calendar.DAY_OF_WEEK);
if(diadasemana==1){
Query consulta = manager.createQuery("select cargahorariadomingo from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==2){
Query consulta = manager.createQuery("select cargahorariasegunda from Escala");
cargahoraria = (Date) consulta.getSingleResult();
DateTime carga = new DateTime(cargahoraria);
resultado = dt.compareTo(carga);
}else if(diadasemana==3){
Query consulta = manager.createQuery("select cargahorariaterca from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==4){
Query consulta = manager.createQuery("select cargahorariaquarta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==5){
Query consulta = manager.createQuery("select cargahorariaquinta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==6){
Query consulta = manager.createQuery("select cargahorariasexta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else{
Query consulta = manager.createQuery("select cargahorariasabado from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}
}
Ou seja, preciso verificar se o horário passado por parâmetro é igual, maior ou inferior a cargahoraria. Como faço isso?
A ideia é a mesma,
Como voce recupera a carga horaria entao é so comparar com a hora e minuto que voce esta passando no metodo;
Estou fazendo que nem eu fiz para pegar a hora e o minuto para passar por parâmetro para o método. Se um funcionário entra as 08:30 e sai as 11:30 e retorna as 14:00 e sai as 18:00 dando 007 horas de trabalho ao todo sendo que a cargahoraria é 08 horas. Nesse caso o resultado está sendo 23, não teria que ser -1?
Abaixo está o código que estou utilizando para isso:
public void atualizarHorario(int idcolaborador, Date data, int horas, int minutos){
EntityManager manager = getEntityManager();
int diadasemana, hora=0, min=0;
Date cargahoraria = null, dt1;
long horafalta, horaextra, result;
DateTime dt;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
GregorianCalendar cal = new GregorianCalendar();
Calendar cl = Calendar.getInstance();
cl.set(cl.HOUR_OF_DAY, horas);
cl.set(cl.MINUTE, minutos);
dt1 = cl.getTime();
cal.setTime(data);
diadasemana = cal.get(Calendar.DAY_OF_WEEK);
if(diadasemana==1){
Query consulta = manager.createQuery("select cargahorariadomingo from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==2){
Query consulta = manager.createQuery("select cargahorariasegunda from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==3){
Query consulta = manager.createQuery("select cargahorariaterca from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==4){
Query consulta = manager.createQuery("select cargahorariaquarta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==5){
Query consulta = manager.createQuery("select cargahorariaquinta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else if(diadasemana==6){
Query consulta = manager.createQuery("select cargahorariasexta from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}else{
Query consulta = manager.createQuery("select cargahorariasabado from Escala");
cargahoraria = (Date) consulta.getSingleResult();
}
DateTime carga = new DateTime(cargahoraria);
dt = new DateTime(dt1);
hora = Hours.hoursBetween(carga, dt).getHours();
hora = hora % 24;
min = Minutes.minutesBetween(carga, dt).getMinutes()%60;
}
Alguma sugestão?
Faz um debug nesse metodo e veja em que momento o calculo esta dando errado.
eu acrescentei essas duas linhas aki:
cl.set(cl.SECOND, 0);
cl.set(cl.MILLISECOND, 0);
está dando erro nessa linha:
hora = Hours.hoursBetween(carga, dt).getHours();
hora = hora % 24;
Eu vi os valores das variáveis e estão corretas. O que pode ser?
em que momento que voce faz o calculo da hora passada por parametro menos a hora obtida?