Thursday, February 03, 2011

Calculate number of days between two dates

Computing number of days between two dates is simple mathematics. This is how it is done.

public int differenceInDays(Calendar start, Calendar end) {  
    long ms = Math.abs(start.getTimeInMillis() - end.getTimeInMillis());
 
    return (int) (ms / (1000 * 3600 * 24));
}
But does this work in all cases? Not exactly. Take a look at this code:

public Calendar newDateInstance(int year, int month, int day) {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, year);
    cal.set(Calendar.MONTH, month - 1);
    cal.set(Calendar.DAY_OF_MONTH, day);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    return cal;
}

Calendar start = newDateInstance(2011, 3, 13);
Calendar end = newDateInstance(2011, 3, 14);
System.out.println(differenceInDays(start, end));

This code prints 0. Why? Because on 14th March morning Daylight Saving starts and an hour is lost. One solution I use is to add 1 hour to end date to avoid loosing a day. Here's how above code is rewritten.

private void resetTime(Calendar cal) {
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
}

public int differenceInDays(Calendar start, Calendar end) {  
    resetTime(start);
    resetTime(end);
 
    // This is to avoid loosing a day when daylight saving starts(14th March)
    end.set(Calendar.HOUR_OF_DAY, 1);
 
    long ms = Math.abs(start.getTimeInMillis() - end.getTimeInMillis());

    return (int) (ms / (1000 * 3600 * 24));
}

No comments:

Post a Comment