Melhor maneira para caulcular horas, Joda-Time,Query?

3 respostas
Pedrosa

Olá, qual seria a melhor maneira para calcular horas vindas do banco de dados(Postgres) na propria query ou no java?, tenho um exemplo aqui que funciona parcialmente, no entanto se eu coloco um minuto quebrado ele bagunça:

public static void main(String[] args) throws ParseException { 
		// hora quebrada 
		System.out.println(hoursBetweenDates("01/01/06 08:01", "01/01/06 18:30"));

	}

	public static double hoursBetweenDates(String date1Str, String date2Str)
			throws ParseException {
		SimpleDateFormat smf = new SimpleDateFormat("dd/MM/yy hh:mm");
		return hoursBetweenDates(smf.parse(date1Str), smf.parse(date2Str));
	}

	public static double hoursBetweenDates(Date date1, Date date2) {
		long diff = date2.getTime() - date1.getTime();
		return ((double) diff / 1000 / 60 / 60);
	}

Parece meio gambiarra, e disseram que o ideal seria trabalhar com Joda-Time, alguém tem um exemplo simples com ele que retorne horas e minutos?

3 Respostas

andre_a_s

Já tentou usar a classe Calendar ?

T

Calendar não permite calcular as horas entre datas, que é o que ele precisa.

Pergunta - o que você diz que está errado no seu código? Qual é a resposta esperada?

“01/01/06 08:01”, “01/01/06 18:30” - eu suponho que você quer 10 horas e 29 minutos, ou então 10 horas.

Pedrosa

Pesquisei e achei dessa forma aqui:

public class TesteHora {
	public static void main(String[] args) {
		System.out.println(subtraiHora("12:03", "08:36"));
		System.out.println(subtraiHora("18:08", "13:51"));
		System.out.println(somaHora("03:27", "04:17"));
		
	}
	public static String subtraiHora(String hora, String hora2) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
		formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

		long min_1 = getMinutos(hora, formatter);
		long min_2 = getMinutos(hora2, formatter);
		long result = (min_1 - min_2) * 60 * 1000;
		Date data = new Date(result);
		return formatter.format(data);
	}
	public static String somaHora(String hora, String hora2) {
		SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
		formatter.setTimeZone(TimeZone.getTimeZone("GMT"));

		long min_1 = getMinutos(hora, formatter);
		long min_2 = getMinutos(hora2, formatter);
		long result = (min_1 + min_2) * 60 * 1000;
		Date data = new Date(result);
		return formatter.format(data);
	}


	private static long getMinutos(String hora, SimpleDateFormat formatter) {
		Date data;
		try {
			data = formatter.parse(hora);
		} catch (ParseException e) {
			return 0;
		}
		long minutos = data.getTime() / 1000 / 60;
		return minutos;
	}

}

O problema é que vou ter diversas ocorrencias de entrada e saida por dia em um periodo, e como estou trazendo de um resulset, qual seria a melhor maneira de armazenar essas entradas e saidas para acionar meu método que faz o calculo.

Sempre me retorna uma entrada ou uma saida nesse resulset :

"E";"08:30"
"S";"13:00"
"E";"14:00"
"S";"17:00"
"E";"17:15"
"S";"18:30"
Criado 4 de setembro de 2007
Ultima resposta 4 de set. de 2007
Respostas 3
Participantes 3