Só recomendo o uso de GregorianCalendar e seus amigos se você, por algum motivo, não puder usar a Joda Time.
http://joda-time.sourceforge.net/
Uma coisa boba, como saber a diferença entre duas datas, torna-se um parto se você não puder usar a Joda Time.
Vou dar um exemplo: quero saber a diferença de datas entre 07 de setembro de 1822 e 11 de setembro de 2001.
Como você deve saber, há um monte de anos bissextos entre essas datas, e se você simplesmente usar o java.util.Date e fizer algumas contas, vai ter um resultado que tem diferença de horas porque o horário de verão é levado em conta.
Mas não é isso que você quer saber. Você quer saber o resultado que é bastante simples de obter intuitivamente (2001 - 1822 = 179 anos, 11 - 7 = 4 dias).
import org.joda.time.*;
import org.joda.time.format.*;
class TesteJodaTime2 {
public static void main(String[] args) {
// 07 de setembro de 1822
DateTime start = new DateTime(1822, 9, 7, 0, 0, 0, 0);
// 11 de setembro de 2001
DateTime end = new DateTime(2001, 9, 11, 0, 0, 0, 0);
Period per = new Period (start, end);
// Isto imprime "179 years and 4 days"
System.out.println (PeriodFormat.getDefault().print (per));
// Isto imprime "179 anos, 4 dias, 00:00:00"
PeriodFormatter pf = new PeriodFormatterBuilder()
.appendYears()
.appendSuffix (" ano, ", " anos, ")
.appendMonths()
.appendSuffix (" mês, ", " meses, ")
.appendWeeks()
.appendSuffix (" semana, ", " semanas, ")
.appendDays()
.appendSuffix (" dia, ", " dias, ")
.printZeroAlways()
.minimumPrintedDigits(2)
.appendHours()
.appendSeparator(":")
.appendMinutes()
.appendSeparator(":")
.appendSeconds()
.toFormatter();
System.out.println (pf.print (per));
}
}