1. Overview
In this quick write-up, we’ll explore multiple possibilities of calculating the difference between two dates in Java.
2. Core Java
2.1. java.util.Date
Let’s start by using the core Java APIs to do the calculation and determine the number of days between the two dates:
@Test public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH); Date firstDate = sdf.parse("06/24/2017"); Date secondDate = sdf.parse("06/30/2017"); long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime()); long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS); assertEquals(diff, 6); }
2.2. java.time – Since Java 8
Now, calculating the difference is more intuitive if we use LocalDate, LocalDateTime & Duration to represent the two dates (with or without time):
The LocalDate difference:
@Test public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() { LocalDate now = LocalDate.now(); LocalDate sixDaysBehind = now.minusDays(6); Duration duration = Duration.between(now, sixDaysBehind); long diff = Math.abs(duration.toDays()); assertEquals(diff, 6); }
The LocalDateTime case:
@Test public void givenTwoDateTimesInJava8_whenDifferentiating_thenWeGetSix() { LocalDateTime now = LocalDateTime.now(); LocalDateTime sixMinutesBehind = now.minusMinutes(6); Duration duration = Duration.between(now, sixMinutesBehind); long diff = Math.abs(duration.toMinutes()); assertEquals(diff, 6); }
Here‘s a bit more detail on this API.
3. External Libraries
3.1. JodaTime
We can also do a relatively straightforward implementation with JodaTime:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.9.9</version> </dependency>
You can get the latest version of Joda-time from Maven Central.
LocalDate case:
@Test public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { LocalDate now = LocalDate.now(); LocalDate sixDaysBehind = now.minusDays(6); Period period = new Period(now, sixDaysBehind); long diff = Math.abs(period.getDays()); assertEquals(diff, 6); }
Similarly, with LocalDateTime it is:
@Test public void givenTwoDateTimesInJodaTime_whenDifferentiating_thenWeGetSix() { LocalDateTime now = LocalDateTime.now(); LocalDateTime sixMinutesBehind = now.minusMinutes(6); Period period = new Period(now, sixMinutesBehind); long diff = Math.abs(period.getDays()); }
3.2. Date4J
Date4j also provides a straightforward and simple implementation, without the note that, in this case, we need to explicitly provide a TimeZone.
Let’s start with the Maven dependency:
<dependency> <groupId>com.darwinsys</groupId> <artifactId>hirondelle-date4j</artifactId> <version>1.5.1</version> </dependency>
Here’s a quick test working with the standard DateTime:
@Test public void givenTwoDatesInDate4j_whenDifferentiating_thenWeGetSix() { DateTime now = DateTime.now(TimeZone.getDefault()); DateTime sixDaysBehind = now.minusDays(6); long diff = Math.abs(now.numDaysFrom(sixDaysBehind)); assertEquals(diff, 6); }
4. Conclusion
In this tutorial, we illustrated a few ways of calculating the difference between dates (with and without time), both in plain Java as well as using external libraries.