May - Oct 2006 Calendar

 

 

Finding the difference between two dates isn’t as straightforward as subtracting the two dates and dividing the result by /*(24 * 60 * 60 * 1000). Infact, its erroneous!

Going the ‘milliseconds way’ will lead to rounding off errors and they become most evident once you have a little thing like “Daylight Savings Time” come into the picture.

The Correct Way:

 

/** Using Calendar – THE CORRECT WAY**/
//assert: startDate must be before endDate
public static long daysBetween(Calendar startDate, Calendar endDate) {
Calendar date = (Calendar) startDate.clone();
long daysBetween = 0;
while (date.before(endDate)) {
date.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
}

 

 

 

 

 

or more efficiently,   if you’re using the Gregorian Calendar:

 

/** Using Calendar – THE CORRECT (& Faster) WAY**/
/****Needs testing …… Anyone?****/
//assert: startDate must be before endDate
public static long daysBetween(final Calendar startDate, final Calendar endDate) {
int MILLIS_IN_DAY = 1000 * 60 * 60 * 24;
long endInstant = endDate.getTimeInMillis();
int presumedDays = (int) ((endInstant – startDate.getTimeInMillis()) / MILLIS_IN_DAY);
Calendar cursor = (Calendar) startDate.clone();
cursor.add(Calendar.DAY_OF_YEAR, presumedDays);
long instant = cursor.getTimeInMillis();
if (instant == endInstant)
return presumedDays;
final int step = instant < endInstant ? 1 : -1;
do {
cursor.add(Calendar.DAY_OF_MONTH, step);
presumedDays += step;
} while (cursor.getTimeInMillis() != endInstant);
return presumedDays;
}

 
Lets take, for example, the difference between the two dates 03/24/2007 and 03/25/2007 should be 1 day;
However, using the millisecond route, you’ll get 0 days,

 

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DateTest {

public class DateTest {

static SimpleDateFormat sdf = new SimpleDateFormat(“dd-MMM-yyyy”);

public static void main(String[] args) {

TimeZone.setDefault(TimeZone.getTimeZone(“Europe/London”));

//diff between these 2 dates should be 1
Date d1 = new Date(“01/01/2007 12:00:00”);
Date d2 = new Date(“01/02/2007 12:00:00”);

//diff between these 2 dates should be 1
Date d3 = new Date(“03/24/2007 12:00:00”);
Date d4 = new Date(“03/25/2007 12:00:00”);

Calendar cal1 = Calendar.getInstance();cal1.setTime(d1);
Calendar cal2 = Calendar.getInstance();cal2.setTime(d2);
Calendar cal3 = Calendar.getInstance();cal3.setTime(d3);
Calendar cal4 = Calendar.getInstance();cal4.setTime(d4);

printOutput(“Manual   “, d1, d2, calculateDays(d1, d2));
printOutput(“Calendar “, d1, d2, daysBetween(cal1, cal2));
System.out.println(“—“);
printOutput(“Manual   “, d3, d4, calculateDays(d3, d4));
printOutput(“Calendar “, d3, d4, daysBetween(cal3, cal4));
}

private static void printOutput(String type, Date d1, Date d2, long result) {
System.out.println(type+ “- Days between: ” + sdf.format(d1)
+ ” and ” + sdf.format(d2) + ” is: ” + result);
}

/** Manual Method – YIELDS INCORRECT RESULTS – DO NOT USE**/
/* This method is used to find the no of days between the given dates */
public static long calculateDays(Date dateEarly, Date dateLater) {
return (dateLater.getTime() – dateEarly.getTime()) / (24 * 60 * 60 * 1000);
}

/** Using Calendar – THE CORRECT WAY**/
public static long daysBetween(Calendar startDate, Calendar endDate) {
Calendar date = (Calendar) startDate.clone();
long daysBetween = 0;
while (date.before(endDate)) {
date.add(Calendar.DAY_OF_MONTH, 1);
daysBetween++;
}
return daysBetween;
}
}

 

 

 

OUTPUT:
Manual – Days between: 01-Jan-2007 and 02-Jan-2007 is: 1
Calendar – Days between: 01-Jan-2007 and 02-Jan-2007 is: 1

Manual – Days between: 24-Mar-2007 and 25-Mar-2007 is: 0
Calendar – Days between: 24-Mar-2007 and 25-Mar-2007 is: 1

 

 

 

Advertisements
Comments
  1. Thomas says:

    I can’t find the website, where you copied this from, but I use “correct and faster”-method and wanted to say that the part “!= endInstant” will sometimes result in an endless loop. But it’s easy to fix that.

  2. faisal says:

    Why not use DateUtils from Commons Lang or use Joda Times and save yourself from this useless effort?

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s