Me encontré con la misma necesidad y comencé con la respuesta de @alain.janinm, que es buena pero no da exactamente el mismo resultado en algunos casos.
ejemplo:
Considere los meses entre el 17/02/2013 y el 11/03/2016 ("dd/MM/yyyy"
)
Resultado de Oracle:36,8064516129032
Método Java de @Alain.janinm respuesta:36.74193548387097
Estos son los cambios que hice para obtener un resultado más cercano al months_between()
de Oracle función :
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;
}
Con esta función el resultado de la llamada para las fechas 17/02/2013 y 11/03/2016 es:36.806451612903224
Nota:según tengo entendido, months_between()
de Oracle la función considera que todos los meses tienen 31 días