Eu me deparei com a mesma necessidade e comecei com a resposta @alain.janinm, que é boa, mas não dá exatamente o mesmo resultado em alguns casos.
ex:
Considere os meses entre 17/02/2013 e 11/03/2016 (
"dd/MM/yyyy"
)Resultado do Oracle:
36,8064516129032
Método Java de @Alain.janinm resposta:
36.74193548387097
Aqui estão as alterações que fiz, para obter um resultado mais próximo do
months_between()
do Oracle função:public static double monthsBetween(Date startDate, Date endDate){
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
int startDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
int startMonth = cal.get(Calendar.MONTH);
int startYear = cal.get(Calendar.YEAR);
cal.setTime(endDate);
int endDayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
int endMonth = cal.get(Calendar.MONTH);
int endYear = cal.get(Calendar.YEAR);
int diffMonths = endMonth - startMonth;
int diffYears = endYear - startYear;
int diffDays = endDayOfMonth - startDayOfMonth;
return (diffYears * 12) + diffMonths + diffDays/31.0;
}
Com esta função o resultado da chamada para as datas 17/02/2013 e 11/03/2016 é:
36.806451612903224
Nota:Do meu entendimento,
months_between()
da Oracle função considera que todos os meses têm 31 dias