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