[Resolvido]Calcular diferença entre duas datas

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!

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

Olá Lucas,

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

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.

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:

[code]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();
}

}[/code]

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