I am stuck with a problem. I have two Date objects (util class objects). I want the difference between these two dates as the number of days between them? I am using Java 8. Can you please help me with this? Searched the web a lot. Some are saying to use Joda, while some are using TimeUnit. Some says Timeunit not handles leap year properly etc. I am confused now. Here is the link I read: http://stackoverflow.com/questions/20165564/calculating-days-between-two-dates-with-in-java

Thanks in advance.

2 Years
Discussion Span
Last Post by JamesCherrill

In Java 8 all your problems are solved!
It includes a completely new package for handling dates, times, intervals etc based on everything that was wrong with the old classes, and stealing a lot from Joda time
You just need the ChronoUnit.between method with two Instant objects
Theres a really simple example here:
.. but unbelievably there's a bug in the example (gap is declared as the wrong type, should be long), so here's a working example that illustrates just how neat the new classes are...

        Instant instant1, instant2; 
        long interval;

        instant1 = Instant.now();
        instant2 = Instant.now().plus(48, ChronoUnit.HOURS);

        interval = ChronoUnit.DAYS.between(instant1,instant2);

        System.out.println(instant1 +" - " + instant2 + " = " +  interval);

Don't worry about leap years etc, these classes use the most correct algorithms for dates known to man.

Edited by JamesCherrill


HI james,

Thanks for the response.

But I have two Date object. I have to use Date date1 , Date date2. Now, I want to find days between them. Can we incorporate Date datatype?

Also, It is correct?

long diff = date2.getTime() - date1.getTime();
return TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);

Basically, I want to get rid of leap year problem, day-light saving time thing etc. So, can you please suggest now?

Edited by nitin1


Use Date's toInstant() method to convert your Dates to Instants, then proceed as above.
return ChronoUnit.DAYS.between(date1.toInstant(), date2.toInstant());
Couldn't be easier.


Thanks James for the quick response.

Instant instant1 = date1.toInstant();
Instant instant2 = date2.toInstant();

return ChronoUnit.DAYS.between(instant1,instant2);

Seems good?

Also, can you point out possible things in the code snippet I provided in my last comment? That will improve my understanding.


Your earlierccode snippet is OK, althoug you may as well just divide by the number of mSec in a day. There may be some really obscure traps in there because Date objects are in millisecs so you have to be vary careful about the time-of-day part of the object (especially when changing to/from DST). Personally I suggested what I did because
a) it goes with the current date/time support rather than the inferior earlier one
b} its going to work properly
c the code reads so clearly that even a non-Java newbie could guess what it means. I'm the world's biggest fan of easy-toread-and-understand code. In fact I'm obsessed with it.

Edited by JamesCherrill


Hey James,

The code we discussed about date is giving zero days.

Instant startInstant = myclassObj.getStartTime().tonstant() ;
Instant endInstant = myclassObj.getExpiredTime().toInstant();

long days = ChronoUnit.DAYS.between(startInstant, endInstant);


Edited by nitin1

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.