Find the Difference Between Two Dates in Java
Sometimes when you’re writing a program, you want to be able determine the difference in time between two dates. This might be because you want to see how long it took something to run, or you might be processing data and need to find a time span between two events. In searching around the Internet, I found some forum posts that explained how to do this to some extent, but below is an expanded solution that can help you find the difference in years, months, days, hours, minutes, and seconds.
Please note that the differences in months and years are only approximate. On average a year in the Gregorian calendar lasts 365.2425 days (because of leap years, etc.), so it just divides the number of days by that number to get the difference in days; and that number is divided by 12 to get the difference in months. In many cases, this approximate measure should be adequate, but a more precise answer is possible with more advanced coding. Please let me know if you develop this yourself or if you would like me to post such a solution.
public class Dates { public static double DifferenceInMonths(Date date1, Date date2) { return DifferenceInYears(date1, date2) * 12; } public static double DifferenceInYears(Date date1, Date date2) { double days = DifferenceInDays(date1, date2); return days / 365.2425; } public static double DifferenceInDays(Date date1, Date date2) { return DifferenceInHours(date1, date2) / 24.0; } public static double DifferenceInHours(Date date1, Date date2) { return DifferenceInMinutes(date1, date2) / 60.0; } public static double DifferenceInMinutes(Date date1, Date date2) { return DifferenceInSeconds(date1, date2) / 60.0; } public static double DifferenceInSeconds(Date date1, Date date2) { return DifferenceInMilliseconds(date1, date2) / 1000.0; } private static double DifferenceInMilliseconds(Date date1, Date date2) { return Math.abs(GetTimeInMilliseconds(date1) - GetTimeInMilliseconds(date2)); } private static long GetTimeInMilliseconds(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.getTimeInMillis() + cal.getTimeZone().getOffset(cal.getTimeInMillis()); } }
This is the code I used to test it:
public static boolean Test(double expected, double actual) { boolean result = MathUtility.Round(expected, 4) == MathUtility.Round(actual, 4); if (!result) System.out.println("Expected: " + expected + ", Actual: " + actual); return result; } System.out.println(Test(1, Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 1)))); System.out.println(Test(1+60, Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 1, 1)))); System.out.println(Test(1+60+(60*60), Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 1, 1, 1)))); System.out.println(Test(1+60+(60*60)+(24*60*60), Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 2, 1, 1, 1)))); System.out.println(Test(1+60+(60*60)+(31*24*60*60), Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test(1+60+(60*60)+(31*24*60*60)+(366*24*60*60), Dates.DifferenceInSeconds(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2009, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test(1.0/60, Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 1)))); System.out.println(Test((1.0/60)+1, Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 1, 1)))); System.out.println(Test((1.0/60)+1+60, Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 1, 1, 1)))); System.out.println(Test((1.0/60)+1+60+(24*60), Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 2, 1, 1, 1)))); System.out.println(Test((1.0/60)+1+60+(24*60*31), Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test((1.0/60)+1+60+(24*60*31)+(24*60*366), Dates.DifferenceInMinutes(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2009, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test(1.0/(60*60), Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 1)))); System.out.println(Test(1.0/(60*60)+1.0/60, Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 1, 1)))); System.out.println(Test(1.0/(60*60)+1.0/60+1, Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 1, 1, 1)))); System.out.println(Test(1.0/(60*60)+1.0/60+1+24, Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 2, 1, 1, 1)))); System.out.println(Test(1.0/(60*60)+1.0/60+1+(24*31), Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test(1.0/(60*60)+1.0/60+1+(24*31)+(24*366), Dates.DifferenceInHours(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2009, Calendar.FEBRUARY, 1, 1, 1, 1)))); System.out.println(Test(1.0, Dates.DifferenceInDays(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 2, 0, 0, 0)))); System.out.println(Test(31.0, Dates.DifferenceInDays(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 0, 0, 0)))); System.out.println(Test(28.0, Dates.DifferenceInDays(Dates.CreateDate(2007, Calendar.MARCH, 1, 0, 0, 0), Dates.CreateDate(2007, Calendar.FEBRUARY, 1, 0, 0, 0)))); System.out.println(Test(29.0, Dates.DifferenceInDays(Dates.CreateDate(2008, Calendar.MARCH, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 0, 0, 0)))); System.out.println(Test(365.0, Dates.DifferenceInDays(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2007, Calendar.JANUARY, 1, 0, 0, 0)))); System.out.println(Test(366.0, Dates.DifferenceInDays(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2009, Calendar.JANUARY, 1, 0, 0, 0)))); System.out.println(Test(0.4928, Dates.DifferenceInMonths(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 16, 0, 0, 0)))); System.out.println(Test(1.0185, Dates.DifferenceInMonths(Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.FEBRUARY, 1, 0, 0, 0)))); System.out.println(Test(0.9993, Dates.DifferenceInYears(Dates.CreateDate(2007, Calendar.JANUARY, 1, 0, 0, 0), Dates.CreateDate(2008, Calendar.JANUARY, 1, 0, 0, 0))));
Notes: See also this post about rounding numbers and this post about creating date objects. Please also note that sometimes Java does something weird with rounding, which is why the Test method rounds the results to four digits.
