How to compare two dates in Java
In this article, you’ll learn how to compare two dates in Java using both Java 8 new date and time API and the legacy Date and Calendar API.
- isAfter() — Return true if this date is after the specified date.
- isBefore() — Return true if this date is before the specified date.
- isEqual() — Return true if this date is equal to the specified date.
- compareTo() — Returns the comparator value, negative if less, positive if greater.
Let us look at the examples that use the above methods to compare new date and time API instances.
An instance of LocalDate represents a date in ISO-8601 format (yyyy-MM-dd) without time. Unlike the Date , it doesn’t store any time or timezone information. The following example demonstrates how you can parse two strings to instances of LocalDate and then compare them to see if they before, equal, or after each other:
LocalDate date1 = LocalDate.parse("2018-04-12"); LocalDate date2 = LocalDate.parse("2019-07-17"); // compare `LocalDate` instances System.out.println(date1 + " is BEFORE " + date2 + ": " + date1.isBefore(date2)); System.out.println(date1 + " is AFTER " + date2 + ": " + date1.isAfter(date2)); System.out.println(date1 + " is EQUAL to " + date2 + ": " + date1.isEqual(date2));
2018-04-12 is BEFORE 2019-07-17: true 2018-04-12 is AFTER 2019-07-17: false 2018-04-12 is EQUAL to 2019-07-17: false
LocalDate date1 = LocalDate.of(2018, Month.JULY, 12); LocalDate date2 = LocalDate.of(2016, Month.AUGUST, 25); // compare dates int diff = date1.compareTo(date2); if (diff == 0) System.out.println(date1 + " is EQUAL to " + date2); > else if (diff > 0) System.out.println(date1 + " is AFTER " + date2); > else System.out.println(date1 + " is BEFORE " + date2); >
2018-07-12 is AFTER 2016-08-25
A LocalTime represents a time without date in ISO-8601 format (HH:mm:ss). Here is an example that shows how to compare two instances of LocalTime in Java 8 and higher:
LocalTime time1 = LocalTime.parse("10:25:39"); LocalTime time2 = LocalTime.parse("14:20:00"); // compare `LocalTime` instances System.out.println(time1 + " is BEFORE " + time2 + "? " + time1.isBefore(time2)); System.out.println(time1 + " is AFTER " + time2 + "? " + time1.isAfter(time2));
10:25:39 is BEFORE 14:20? true 10:25:39 is AFTER 14:20? false
You can also compare two instances of LocalTime by using compareTo() method just like LocalDate :
LocalTime time1 = LocalTime.of(22, 45, 12); LocalTime time2 = LocalTime.of(8, 25, 25); // compare times int diff = time1.compareTo(time2); if (diff == 0) System.out.println(time1 + " is EQUAL to " + time2); > else if (diff > 0) System.out.println(time1 + " is AFTER " + time2); > else System.out.println(time1 + " is BEFORE " + time2); >
The LocalDateTime class represents both date and time together without timezone in ISO-8601 format. To compare two instances of LocalDateTime , you can use the same isAfter() , isBefore() , and isEqual() methods as shown below:
LocalDateTime dt1 = LocalDateTime.parse("2016-04-12T12:55:15"); LocalDateTime dt2 = LocalDateTime.parse("2017-07-15T05:05:51"); // compare `LocalDateTime` instances System.out.println(dt1 + " is BEFORE " + dt2 + ": " + dt1.isBefore(dt2)); System.out.println(dt1 + " is AFTER " + dt2 + ": " + dt1.isAfter(dt2)); System.out.println(dt1 + " is EQUAL to " + dt2 + ": " + dt1.isEqual(dt2));
2016-04-12T12:55:15 is BEFORE 2017-07-15T05:05:51: true 2016-04-12T12:55:15 is AFTER 2017-07-15T05:05:51: false 2016-04-12T12:55:15 is EQUAL to 2017-07-15T05:05:51: false
LocalDateTime dt1 = LocalDateTime.of(1989, Month.AUGUST, 2, 10, 0); LocalDateTime dt2 = LocalDateTime.of(1992, Month.MARCH, 23, 17, 33); // compare dates and times int diff = dt1.compareTo(dt2); if (diff == 0) System.out.println(dt1 + " is EQUAL to " + dt2); > else if (diff > 0) System.out.println(dt1 + " is AFTER " + dt2); > else System.out.println(dt1 + " is BEFORE " + dt2); >
1989-08-02T10:00 is BEFORE 1992-03-23T17:33
A ZonedDateTime represents a date and time with a timezone in ISO-8601 format (e.g 2015-05-15T10:15:30+01:00[Europe/Paris]). It is basically used to deal with timezone-specific dates and times. The following example demonstrates how you can compare two instances of ZonedDateTime in Java:
ZonedDateTime dt1 = ZonedDateTime.parse("2017-05-15T10:15:30+01:00[Asia/Karachi]"); ZonedDateTime dt2 = ZonedDateTime.parse("2015-05-15T10:15:30+01:00[Europe/Paris]"); // compare `ZonedDateTime` instances System.out.println(dt1 + " is BEFORE " + dt2 + ": " + dt1.isBefore(dt2)); System.out.println(dt1 + " is AFTER " + dt2 + ": " + dt1.isAfter(dt2)); System.out.println(dt1 + " is EQUAL to " + dt2 + ": " + dt1.isEqual(dt2));
2017-05-15T10:15:30+05:00[Asia/Karachi] is BEFORE 2015-05-15T10:15:30+02:00[Europe/Paris]: false 2017-05-15T10:15:30+05:00[Asia/Karachi] is AFTER 2015-05-15T10:15:30+02:00[Europe/Paris]: true 2017-05-15T10:15:30+05:00[Asia/Karachi] is EQUAL to 2015-05-15T10:15:30+02:00[Europe/Paris]: false
ZonedDateTime also provides the compareTo() method to perform the comparison between two of its instances:
ZonedDateTime dt1 = ZonedDateTime.of(2015, 7, 12, 10, 0, 0, 0, ZoneId.of("Europe/Paris")); ZonedDateTime dt2 = ZonedDateTime.of(2019, 12, 5, 17, 0, 0, 0, ZoneId.of("America/New_York")); // compare zoned dates and times int diff = dt1.compareTo(dt2); if (diff == 0) System.out.println(dt1 + " is EQUAL to " + dt2); > else if (diff > 0) System.out.println(dt1 + " is AFTER " + dt2); > else System.out.println(dt1 + " is BEFORE " + dt2); >
2015-07-12T10:00+02:00[Europe/Paris] is BEFORE 2019-12-05T17:00-05:00[America/New_York]
An instance of OffsetDateTime represents a date and time with an offset from UTC/Greenwich in the ISO-8601 format (e.g. 2018-06-30T23:15:30+03:30). Let us look at the below example that shows how you can compare two instances of OffsetDateTime :
OffsetDateTime dt1 = OffsetDateTime.parse("2018-06-30T23:15:30+03:30"); OffsetDateTime dt2 = OffsetDateTime.parse("2011-11-25T23:15:30-05:00"); // compare `OffsetDateTime` instances System.out.println(dt1 + " is BEFORE " + dt2 + ": " + dt1.isBefore(dt2)); System.out.println(dt1 + " is AFTER " + dt2 + ": " + dt1.isAfter(dt2)); System.out.println(dt1 + " is EQUAL to " + dt2 + ": " + dt1.isEqual(dt2));
2018-06-30T23:15:30+03:30 is BEFORE 2011-11-25T23:15:30-05:00: false 2018-06-30T23:15:30+03:30 is AFTER 2011-11-25T23:15:30-05:00: true 2018-06-30T23:15:30+03:30 is EQUAL to 2011-11-25T23:15:30-05:00: false
OffsetDateTime dt1 = OffsetDateTime.of(2011, 8, 25, 15, 40, 0, 0, ZoneOffset.of("+03:00")); OffsetDateTime dt2 = OffsetDateTime.of(2017, 3, 15, 5, 15, 45, 0, ZoneOffset.of("-05:00")); // compare offset dates and times int diff = dt1.compareTo(dt2); if (diff == 0) System.out.println(dt1 + " is EQUAL to " + dt2); > else if (diff > 0) System.out.println(dt1 + " is AFTER " + dt2); > else System.out.println(dt1 + " is BEFORE " + dt2); >
2011-08-25T15:40+03:00 is BEFORE 2017-03-15T05:15:45-05:00
An Instant represents a specific moment on the timeline in UTC. Here is how you can compare two instances of Instant :
Instant instant1 = Instant.parse("2019-10-20T12:55:30.00Z"); Instant instant2 = Instant.parse("2017-01-25T23:15:30.55Z"); // compare `Instant` instances System.out.println(instant1 + " is BEFORE " + instant2 + ": " + instant1.isBefore(instant2)); System.out.println(instant1 + " is AFTER " + instant2 + ": " + instant1.isAfter(instant2));
2019-10-20T12:55:30Z is BEFORE 2017-01-25T23:15:30.550Z: false 2019-10-20T12:55:30Z is AFTER 2017-01-25T23:15:30.550Z: true
Instant instant1 = Instant.parse("2019-10-20T12:55:30.00Z"); Instant instant2 = Instant.parse("2017-01-25T23:15:30.55Z"); // compare offset dates and times int diff = instant1.compareTo(instant2); if (diff == 0) System.out.println(instant1 + " is EQUAL to " + instant2); > else if (diff > 0) System.out.println(instant1 + " is AFTER " + instant2); > else System.out.println(instant1 + " is BEFORE " + instant2); >
2019-10-20T12:55:30Z is AFTER 2017-01-25T23:15:30.550Z
Before Java 8, java.util.Date and java.util.Calendar classes were used to manipulate dates and times. These legacy classes have many shortcomings fixed with the release of the new date and time API. But these classes are still actively used in old projects. So it is worth knowing how to compare two instances of Date or Calendar . Both Date and Calendar classes provide the following method for date comparison.
The compareTo() method compares two dates for ordering. It returns 0 if both dates are equal. Otherwise, a positive value if this date is greater than the specified date and a negative if less. The following example shows how you can compare two instances of Date by using the compareTo() method:
try // specify date pattern SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // parse string to date Date date1 = format.parse("2019-10-20"); Date date2 = format.parse("2017-01-25"); // compare dates int diff = date1.compareTo(date2); if (diff == 0) System.out.println(date1 + " is EQUAL to " + date2); > else if (diff > 0) System.out.println(date1 + " is AFTER " + date2); > else System.out.println(date1 + " is BEFORE " + date2); > > catch (ParseException ex) ex.printStackTrace(); >
Sun Oct 20 00:00:00 PKT 2019 is AFTER Wed Jan 25 00:00:00 PKT 2017
Similarly, you can also compare two instances of Calendar using the compareTo() method as shown below:
try // specify date pattern SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // init instances of `Calcendar` Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); // parse string to date and set calendar date cal1.setTime(format.parse("2019-10-20")); cal2.setTime(format.parse("2017-01-25")); // compare `Calendar` instances int diff = cal1.compareTo(cal2); if (diff == 0) System.out.println(cal1 + " is EQUAL to " + cal2); > else if (diff > 0) System.out.println(cal1 + " is AFTER " + cal2); > else System.out.println(cal1 + " is BEFORE " + cal2); > > catch (ParseException ex) ex.printStackTrace(); >
A more user-friendly way to compare two instances of old date and time API is using the before() , after() , and eqauls() methods. These methods return true if this instance is before, after, or equal to the specified instance. Here is an example that uses the above methods to compare two instances of Date :
try // specify date pattern SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // parse string to date Date date1 = format.parse("2017-12-25"); Date date2 = format.parse("2016-08-05"); //// compare `Date` instances System.out.println(date1 + " is BEFORE " + date2 + ": " + date1.before(date2)); System.out.println(date1 + " is AFTER " + date2 + ": " + date1.after(date2)); System.out.println(date1 + " is EQUAL to " + date2 + ": " + date1.equals(date2)); > catch (ParseException ex) ex.printStackTrace(); >
Mon Dec 25 00:00:00 PKT 2017 is BEFORE Fri Aug 05 00:00:00 PKT 2016: false Mon Dec 25 00:00:00 PKT 2017 is AFTER Fri Aug 05 00:00:00 PKT 2016: true Mon Dec 25 00:00:00 PKT 2017 is EQUAL to Fri Aug 05 00:00:00 PKT 2016: false
Finally, in the end, let us look at an example that demonstrates how to compare two instances of Calendar API:
try // specify date pattern SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // init instances of `Calcendar` Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); // parse string to date and set calendar date cal1.setTime(format.parse("2010-08-20")); cal2.setTime(format.parse("2019-01-25")); //// compare `Calendar` instances System.out.println(cal1 + " is BEFORE " + cal2 + ": " + cal1.before(cal2)); System.out.println(cal1 + " is AFTER " + cal2 + ": " + cal1.after(cal2)); System.out.println(cal1 + " is EQUAL to " + cal2 + ": " + cal1.equals(cal2)); > catch (ParseException ex) ex.printStackTrace(); >
In this article, we covered multiple ways to compare dates originating from different APIs in Java. We started with Java 8 new date and time API and discussed how to compare dates with or without time and timezones. In the end, we also looked at comparing dates using the legacy Date and Calendar API. The new date and time API introduced in Java 8 provides a broad range of classes that have simplified working in dates and times. These classes are thread-safe, easier to use, and offer utility methods for performing various operations. Read next: How to get current date and time in Java ✌️ Like this article? Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.