Bom dia,
Eu não tenho muita afinidade em trabalhar com horas, e preciso de um método que calcule a diferença entre um horário inicial e um horário final, os dois horários estão em campos do tipo JFormattedTextField
, eu preciso recuperá-los a partir destes campos formatados e retornar a diferença em um campo JTextField
, como formato inteiro.
Exemplo Hora Inicial: 13:00:00
Exemplo Hora Final: 14:00:00
Horas Trabalhadas: 1
O método que eu estou utilizando está retornando sempre o valor “0” nas horas trabalhadas!
Segue código do método e chamada do mesmo:
private void calcularDiferencaHoras(String horaInicial, String horaFinal, JTextField campo){
SimpleDateFormat sdf1 = new SimpleDateFormat(horaInicial);
SimpleDateFormat sdf2 = new SimpleDateFormat(horaFinal);
try {
double horaInic = sdf1.getCalendar().getTimeInMillis();
double horaFim = sdf2.getCalendar().getTimeInMillis();
double diferencaHoras = horaFim - horaInic;
campo.setText(Double.toString(diferencaHoras));
} catch(Exception ex) {
JOptionPane.showMessageDialog(rootPane, "Ocorreu um erro ao calcular as Horas Trabalhadas!", "Atenção", JOptionPane.ERROR_MESSAGE);
campo.setText("");
}
}
Chamada do método:
calcularDiferencaHoras(jFTHoraInicial.getText(), jFTHoraFinal.getText(), jTFHorasTrabalhadas);
Quem puder colaborar desde já agradeço!
Acredito que nas linhas:
SimpleDateFormat sdf1 = new SimpleDateFormat(horaInicial);
SimpleDateFormat sdf2 = new SimpleDateFormat(horaFinal);
o valor de horaInicial e horaFinal seja 13:00:00 e 14:00:00 correto?
se sim, este é seu problema, pois o construtor de SimpleDateFormat deve receber uma MASCARA para posteriormente fazer o PARSE do valor. E vc informou um valor no lugar da mascara.
tente:
SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
Date d1 = sdf1.parse(horaInicial);
Fiz conforme me indicou, agora ele trás um resultado, usando o exemplo de hora inicial 13:00:00 e hora final 14:00:00 ele deveria me retornar o valor esperado que é 1, porem ele me retorna o valor 3600000.0, saberia dizer porque isso ocorre ou oque deveria mudar ?
Segue abaixo método alterado:
private void calcularDiferencaHoras(String horaInicial, String horaFinal, JTextField campo){
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
try {
Date horaIni = sdf.parse(horaInicial);
Date horaFim = sdf.parse(horaFinal);
double horaI = horaIni.getTime();
double horaF = horaFim.getTime();
double diferencaHoras = horaF - horaI;
campo.setText(Double.toString(diferencaHoras));
} catch(Exception ex) {
JOptionPane.showMessageDialog(rootPane, "Ocorreu um erro ao calcular as Horas Trabalhadas!", "Atenção", JOptionPane.ERROR_MESSAGE);
campo.setText("");
}
}
Não, não. Está certo!
Você está pegando o time de cada valor e subtraindo-os.
O time nada mais é do que os MILISEGUNDOS do objeto.
Subtraindo-os você tem a diferença de milisegundos entre um e outro. Para chegar a horas de diferença vc precisa calcular/converter.
Obs.: Recomendo usar long ao invés do double.
3600000ms / 1000 / 60 / 60 = 1 hr
Agora entendi o que acontece quando calculamos horas, deu tudo certo!
muito obrigado por sua ajuda @Rodrigo_Void, fico extremamente agradecido!