[Resolvido]Calcular diferença entre duas datas

4 respostas
mews

Beleza pessoal,

Estou com uma necessidade bem especifica e para perder muito tempo com o desenvolvimento de toda a lógica, podendo correr o risco de ter bugs, vim consultar vocês.

Eu possuo duas datas do tipo java.util.Date e preciso calcular a diferença entre essas duas datas.
O cálculo que estou realizando é com base nos milisegundos referente a cada data.
O problema está em fazer a formação do resultado.

Eu preciso que o resultado seja no formato:

Ex: 2 anos, 3 meses, 22 dias, 13 horas e 10 segundos

Existe um pequeno problema com relação ao mês, pois existem meses que possuem 30 dias, 31 dias, 28 e até mesmo 29 em anos bissextos.

Valew!

4 Respostas

lucas_carvalho100

Acho que é isso que você quer…
http://www.xmission.com/~goodhill/dates/deltaDates.html

mews

Olá Lucas,

Não consegui entender como seria o exemplo na prática.
Você já teria algo desenvolvido?

ViniGodoy

Se você precisa calcular esse tipo de coisa, deixe a API nojenta do Java de lado e use o Joda-Time:
http://joda-time.sourceforge.net/

Lá, a subtração de datas te retornará um objeto do tipo Period, que tem métodos para retornar exatamente o que você quer.

mews

Muito obrigado por me lembrar do Joda-Time.
Essa API é realmente muito boa.

Fui atrás de algo mais claro que pudesse me ajudar a fazer o que eu queria utilizando o Joda-Time e encontrei esse artigo.

Então segue a minha solução:

public class DiffDate
{
	public static void main(String[] args)
	{
		String date1 = "10/07/2010 11:14";
		String date2 = "12/08/2010 09:01";
		
		String mask1 = "dd/MM/yyyy HH:mm";
		String mask2 = "dd/MM/yyyy HH:mm";
		
		DiffDate dif = new DiffDate();
		
		//é necessário que date2 > date1
		System.out.println(dif.calculateDiffDate(date1, mask1, date2, mask2));
		
	}
	
	private String calculateDiffDate(String dataString1, String formatDataString1, String dataString2,
			String formatDataString2)
	{
		Date date1 = formatDate(dataString1, formatDataString1);
		Date date2 = formatDate(dataString2, formatDataString2);

		if (date2.compareTo(date1) > 0)
		{
			//invert a ordem do parametros e insere negativo (-) na frente
			return "(-)" + millisecondsToDateString(date2, date1);
		}
		
		return dateToString(date1, date2);
	}
	
	/**
	 * @param date
	 * @param DATE_FORMAT: dd/MM/yyyy
	 *            dd/MM/yyyy hh:mm
	 *            dd/MM/yyyy hh:mm:ss
	 * @return Date
	 */
	public static Date formatDate(String date, String DATE_FORMAT)
	{
		SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);

		try
		{
			return sdf.parse(date);
		}
		catch (ParseException e)
		{
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * Transforme de Date para data por extenso
	 * 
	 * @param date1
	 * @param date2
	 * 
	 * @return Ex: 1 ano, 3 meses, 1 hora, 10 segundos
	 */
	public static String dateToString(Date date1, Date date2)
	{
		DateTime start = new DateTime(date2);
		DateTime end =  new DateTime(date1);

		Interval interval = new Interval(start, end);

		Period period = interval.toPeriod(PeriodType.yearMonthDayTime());
		
		StringBuilder sdate = new StringBuilder();
		
		sdate.append((period.getYears() == 0) ? "" : ((period.getYears() == 1) ? "1 ano " : period.getYears() + " anos "));
		sdate.append((period.getMonths() == 0) ? "" : ((period.getMonths() == 1) ? "1 mes " : period.getMonths() + " meses "));
		sdate.append((period.getDays() == 0) ? "" : ((period.getDays() == 1) ? "1 dia " : period.getDays() + " dias "));
		sdate.append((period.getHours() == 0) ? "" : ((period.getHours() == 1) ? "1 hora " : period.getHours() + " horas "));
		sdate.append((period.getMinutes() == 0) ? "" : ((period.getMinutes() == 1) ? "1 minuto " : period.getMinutes() + " minutos "));
		sdate.append((period.getSeconds() == 0) ? "" : ((period.getSeconds() == 1) ? "1 segundo " : period.getSeconds() + " segundos "));
		
		return sdate.toString();
	}
	
}

O código ficou um pouco específico para a minha aplicação mas acredito que pode servir para alguém algum dia.
Obrigado pela ajuda de todos.

Vlw

Criado 27 de dezembro de 2010
Ultima resposta 28 de dez. de 2010
Respostas 4
Participantes 3