Link to home
Start Free TrialLog in
Avatar of matthew016
matthew016Flag for Belgium

asked on

Compute number of months between two dates

Hello,

I need to compute the number of months between two dates.
I have 4 variables :
int month1, year1, month2, year2;

for example for respectively 12, 1991, 10, 1991
It must give me 3

Thank you for any help.
ASKER CERTIFIED SOLUTION
Avatar of Mick Barry
Mick Barry
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
monthDiff(getDate(1992, 10), getDate(1991, 12)));

private static Date getDate(int year, int month) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month);
    return cal.getTime();
}
 
private static int monthDiff(Date one, Date two) {
    Calendar calFirst = Calendar.getInstance();
    Calendar calLast = Calendar.getInstance();
 
    if (!one.after(two)) {
        calFirst.setTime(one);
        calLast.setTime(two);
    } else {
        calFirst.setTime(two);
        calLast.setTime(one);
    }
 
    int diff = 0;
    while (!equalMonthAndYear(calFirst, calLast)) {
        diff++;
        calFirst.add(Calendar.MONTH, 1);
    }
    return diff;
}
 
private static boolean equalMonthAndYear(Calendar first, Calendar last) {
    return first.get(Calendar.YEAR) == last.get(Calendar.YEAR) 
           && first.get(Calendar.MONTH) == last.get(Calendar.MONTH);
}

Open in new window

well, I guess all of the above works, but why make life so difficult?
Just compute the "total number of months" for each date and subtract them from each other... then add one to include both the first and the last month.

Like this:
public static int calDiff(int year1, int month1, int year2, int month2) {
	int monthsDiff = (year1 * 12 + month1) - (year2 * 12 + month2);
	return Math.abs(monthsDiff) + 1;
}
 
// or even:
int diff = Math.abs((year1 * 12 + month1) - (year2 * 12 + month2)) + 1;
 
A bit more compact than the solutions above, but at least as readable IMHO...
 
Cheers...

Open in new window

btw... I just now realized what the accepted solution above does....
It performs really badly and uses recursion for no obvious reason...(it's not like some years have more months than others, right?)  You probably won't do that, but if you compute the months between October 1500 and December 2500, it will take at least 5000 times (!) longer (!) than my suggestion and use a LOT of memory in the process... (several megabytes)

Oh yes... AND it returns incorrect results if the two dates are not in the same year... (one month missing) which just shows that it's much too complex for the problem at hand...

P.S.: Just tried this just for fun: For a timespan of more than ~5500 years, you even get an OutOfMemory problem... (or rather a StackOverflowError because this does 5500 nested method calls!)...