mews
Dezembro 27, 2010, 5:16pm
#1
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!
mews
Dezembro 27, 2010, 5:44pm
#3
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.
mews
Dezembro 28, 2010, 10:34am
#5
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