В этой статье показано несколько примеров сравнения двух дат на Java. Обновлено примерами Java 8.
- 1. Сравните две даты
- 1.1 Дата.Сравнение
- 1.2 Дата. до(), Дата.после() и Дата.равно()
- 1.3 Проверьте, находится ли дата в определенном диапазоне
- 2. Сравните два календаря
- 3. Сравните две даты и время( Java 8)
- 3.1 Сравнение двух локальных данных
- 3.2 Сравнение двух локальных значений времени
- 3.3 Сравните два Моментальный
- 4 Проверьте, находится ли дата в определенном диапазоне (Java 8)
- 5 Проверьте, не старше ли дата 6 месяцев
- Рекомендации
1. Сравните две даты
Для унаследованного java.util. Дата
, мы можем использовать Сравнение
, до()
, после()
и равно()
для сравнения двух дат.
1.1 Дата.Сравнение
Ниже приведен пример использования Date.compareTo
для сравнения двух java.util. Дата
на языке Java.
- Возвращаемое значение 0, если дата аргумента равна
Дата
. - Возвращаемое значение больше 0 или положительное, если
Дата
находится после даты аргумента. - Возвращаемое значение меньше 0 или отрицательное, если
Дата
находится перед датой аргумента.
Просмотрите подпись метода Date.compareTo
.
package java.util; public class Date implements java.io.Serializable, Cloneable, Comparable{ public int compareTo(Date anotherDate) { long thisTime = getMillisOf(this); long anotherTime = getMillisOf(anotherDate); return (thisTime
Например:
package com.mkyong.app; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CompareDate1 { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = sdf.parse("2020-01-30"); Date date2 = sdf.parse("2020-01-31"); System.out.println("date1 : " + sdf.format(date1)); System.out.println("date2 : " + sdf.format(date2)); int result = date1.compareTo(date2); System.out.println("result: " + result); if (result == 0) { System.out.println("Date1 is equal to Date2"); } else if (result > 0) { System.out.println("Date1 is after Date2"); } else if (result < 0) { System.out.println("Date1 is before Date2"); } else { System.out.println("How to get here?"); } } }
Выход
date1 : 2020-01-30 date2 : 2020-01-31 result: -1 Date1 is before Date2
Измените дату 1
на 2020-01-31
.
Выход
date1 : 2020-01-31 date2 : 2020-01-31 result: 0 Date1 is equal to Date2
Измените дату 1
на 2020-02-01
.
Выход
date1 : 2020-02-01 date2 : 2020-01-31 result: 1 Date1 is after Date2
1.2 Дата. до(), Дата.после() и Дата.равно()
Ниже приведен более удобный для пользователя метод сравнения двух java.util. Дата
на языке Java.
package com.mkyong.app; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class CompareDate2 { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //Date date1 = sdf.parse("2009-12-31"); Date date1 = sdf.parse("2020-02-01"); Date date2 = sdf.parse("2020-01-31"); System.out.println("date1 : " + sdf.format(date1)); System.out.println("date2 : " + sdf.format(date2)); if (date1.equals(date2)) { System.out.println("Date1 is equal Date2"); } if (date1.after(date2)) { System.out.println("Date1 is after Date2"); } if (date1.before(date2)) { System.out.println("Date1 is before Date2"); } } }
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2
1.3 Проверьте, находится ли дата в определенном диапазоне
В приведенном ниже примере используется get Time()
для проверки, находится ли дата в определенном диапазоне из двух дат (включая дату начала и дату окончания).
package com.mkyong.app; import java.util.Date; public class DateRangeValidator { private final Date startDate; private final Date endDate; public DateRangeValidator(Date startDate, Date endDate) { this.startDate = startDate; this.endDate = endDate; } // inclusive startDate and endDate // the equals ensure the inclusive of startDate and endDate, // if prefer exclusive, just delete the equals public boolean isWithinRange(Date testDate) { // it works, alternatives /*boolean result = false; if ((testDate.equals(startDate) || testDate.equals(endDate)) || (testDate.after(startDate) && testDate.before(endDate))) { result = true; } return result;*/ // compare date and time, inclusive of startDate and endDate // getTime() returns number of milliseconds since January 1, 1970, 00:00:00 GMT return testDate.getTime() >= startDate.getTime() && testDate.getTime() <= endDate.getTime(); } }
package com.mkyong.app; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateWithinRange { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date startDate = sdf.parse("2020-01-01"); Date endDate = sdf.parse("2020-01-31"); System.out.println("startDate : " + sdf.format(startDate)); System.out.println("endDate : " + sdf.format(endDate)); DateRangeValidator checker = new DateRangeValidator(startDate, endDate); Date testDate = sdf.parse("2020-01-01"); System.out.println("testDate : " + sdf.format(testDate)); if(checker.isWithinRange(testDate)){ System.out.println("testDate is within the date range."); }else{ System.out.println("testDate is NOT within the date range."); } } }
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-01-01 testDate is within the date range.
Если мы изменим дату тестирования
на 2020-03-01
.
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-03-01 testDate is NOT within the date range.
2. Сравните два календаря
Для унаследованного java.util. Календарь
, Календарь
работает так же, как java.util. Дата
. И Календарь
содержит аналогичное сравнение С
, до()
, после()
и равно()
для сравнения двух календарей.
package com.mkyong.app; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class CompareCalendar { public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date1 = sdf.parse("2020-02-01"); Date date2 = sdf.parse("2020-01-31"); Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); System.out.println("date1 : " + sdf.format(date1)); System.out.println("date2 : " + sdf.format(date2)); if (cal1.after(cal2)) { System.out.println("Date1 is after Date2"); } if (cal1.before(cal2)) { System.out.println("Date1 is before Date2"); } if (cal1.equals(cal2)) { System.out.println("Date1 is equal Date2"); } } }
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2
3. Сравните две даты и время( Java 8)
Для нового Java 8 java.время. * классы, все содержат похожие Сравнение
, isBefore()
, после()
и равно()
для сравнения двух дат, и это работает одинаково.
ява. время. LocalDate
– дата без времени, без часового пояса.ява. время. Местное время
– время без даты, без часового пояса.ява. время. LocalDateTime
– дата и время, без часового пояса.ява. время. Дата в зоне
– дата и время, с указанием часового пояса.ява. время. Мгновенный
– секунды, прошедшие со времени эпохи Unix (полночь 1 января 1970 года по UTC).
3.1 Сравнение двух локальных данных
В приведенном ниже примере показано, как сравнить две Локальную дату
в Java.
package com.mkyong.app; import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class CompareLocalDate { public static void main(String[] args) throws ParseException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd"); LocalDate date1 = LocalDate.parse("2020-02-01", dtf); LocalDate date2 = LocalDate.parse("2020-01-31", dtf); System.out.println("date1 : " + date1); System.out.println("date2 : " + date2); if (date1.isEqual(date2)) { System.out.println("Date1 is equal Date2"); } if (date1.isBefore(date2)) { System.out.println("Date1 is before Date2"); } if (date1.isAfter(date2)) { System.out.println("Date1 is after Date2"); } // test compareTo if (date1.compareTo(date2) > 0) { System.out.println("Date1 is after Date2"); } else if (date1.compareTo(date2) < 0) { System.out.println("Date1 is before Date2"); } else if (date1.compareTo(date2) == 0) { System.out.println("Date1 is equal to Date2"); } else { System.out.println("How to get here?"); } } }
Выход
date1 : 2020-02-01 date2 : 2020-01-31 Date1 is after Date2 Date1 is after Date2
И мы меняем дату 1
на 2020-01-31
.
Выход
date1 : 2020-01-31 date2 : 2020-01-31 Date1 is equal Date2 Date1 is equal to Date2
3.2 Сравнение двух локальных значений времени
В приведенном ниже примере показано, как сравнить два LocalDateTime
в Java, который работает таким же образом.
package com.mkyong.app; import java.text.ParseException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class CompareLocalDateTime { public static void main(String[] args) throws ParseException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); LocalDateTime date1 = LocalDateTime.parse("2020-01-31 11:44:43", dtf); LocalDateTime date2 = LocalDateTime.parse("2020-01-31 11:44:44", dtf); System.out.println("date1 : " + date1); System.out.println("date2 : " + date2); if (date1.isEqual(date2)) { System.out.println("Date1 is equal Date2"); } if (date1.isBefore(date2)) { System.out.println("Date1 is before Date2"); } if (date1.isAfter(date2)) { System.out.println("Date1 is after Date2"); } } }
Выход
date1 : 2020-01-31T11:44:43 date2 : 2020-01-31T11:44:44 Date1 is before Date2
3.3 Сравните два Моментальный
Новая Java 8 java.время. Мгновенный
, возврат секунд, прошедших с момента времени эпохи Unix (полночь 1 января 1970 года по UTC).
package com.mkyong.app; import java.text.ParseException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; public class CompareInstant { public static void main(String[] args) throws ParseException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"); LocalDateTime date1 = LocalDateTime.parse("2020-01-31 11:44:44", dtf); LocalDateTime date2 = LocalDateTime.parse("2020-01-31 11:44:44", dtf); // convert LocalDateTime to Instant Instant instant1 = date1.toInstant(ZoneOffset.UTC); Instant instant2 = date2.toInstant(ZoneOffset.UTC); // compare getEpochSecond if (instant1.getEpochSecond() == instant2.getEpochSecond()) { System.out.println("instant1 is equal instant2"); } if (instant1.getEpochSecond() < instant2.getEpochSecond()) { System.out.println("instant1 is before instant2"); } if (instant1.getEpochSecond() > instant2.getEpochSecond()) { System.out.println("instant1 is after instant2"); } // compare with APIs if (instant1.equals(instant2)) { System.out.println("instant1 is equal instant2"); } if (instant1.isBefore(instant2)) { System.out.println("instant1 is before instant2"); } if (instant1.isAfter(instant2)) { System.out.println("instant1 is after instant2"); } } }
Выход
instant1 : 2020-01-31T11:44:44Z instant2 : 2020-01-31T11:44:44Z instant1 is equal instant2 instant1 is equal instant2
4 Проверьте, находится ли дата в определенном диапазоне (Java 8)
Мы можем использовать простой находится Перед
, находится после
и равно
, чтобы проверить, находится ли дата в определенном диапазоне дат; например, приведенная ниже проверка программы если Местная дата
находится в пределах января 2020 года.
package com.mkyong.app; import java.time.LocalDate; public class DateRangeValidator { private final LocalDate startDate; private final LocalDate endDate; public DateRangeValidator(LocalDate startDate, LocalDate endDate) { this.startDate = startDate; this.endDate = endDate; } public boolean isWithinRange(LocalDate testDate) { // exclusive startDate and endDate //return testDate.isBefore(endDate) && testDate.isAfter(startDate); // inclusive startDate and endDate return (testDate.isEqual(startDate) || testDate.isEqual(endDate)) || (testDate.isBefore(endDate) && testDate.isAfter(startDate)); } }
package com.mkyong.app; import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class LocalDateWithinRange { public static void main(String[] args) throws ParseException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd"); LocalDate startDate = LocalDate.parse("2020-01-01", dtf); LocalDate endDate = LocalDate.parse("2020-01-31", dtf); System.out.println("startDate : " + startDate); System.out.println("endDate : " + endDate); DateRangeValidator checker = new DateRangeValidator(startDate, endDate); LocalDate testDate = LocalDate.parse("2020-01-01", dtf); System.out.println("\ntestDate : " + testDate); if (checker.isWithinRange(testDate)) { System.out.println("testDate is within the date range."); } else { System.out.println("testDate is NOT within the date range."); } } }
Выход
startDate : 2020-01-01 endDate : 2020-01-31 testDate : 2020-01-01 testDate is within the date range.
Мы можем использовать тот же алгоритм диапазона дат для других классов времени Java 8, таких как Локальное время
, Дата в зоне
, и Мгновенный
.
public boolean isWithinRange(LocalDateTime testDate) { // exclusive startDate and endDate //return testDate.isBefore(endDate) && testDate.isAfter(startDate); // inclusive startDate and endDate return (testDate.isEqual(startDate) || testDate.isEqual(endDate)) || (testDate.isBefore(endDate) && testDate.isAfter(startDate)); }
5 Проверьте, не старше ли дата 6 месяцев
Ниже приведен пример проверки того, является ли дата старше 6 месяцев.
package com.mkyong.app; import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class PlusMonthExample { public static void main(String[] args) throws ParseException { DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd"); LocalDate now = LocalDate.parse("2020-01-01", dtf); LocalDate date1 = LocalDate.parse("2020-07-01", dtf); System.out.println("now: " + now); System.out.println("date1: " + date1); // add 6 months LocalDate nowPlus6Months = now.plusMonths(6); System.out.println("nowPlus6Months: " + nowPlus6Months); System.out.println("If date1 older than 6 months?"); // if want to exclude the 2020-07-01, remove the isEqual if (date1.isAfter(nowPlus6Months) || date1.isEqual(nowPlus6Months)) { System.out.println("Yes"); } else { System.out.println("No"); } } }
Выход
now: 2020-01-01 date1: 2020-07-01 nowPlus6Months: 2020-07-01 If date1 older than 6 months? Yes
Примечание Больше примеров для сравнения или проверки, если дата старше 30 дней или 6 месяцев .
Рекомендации
- Локальная дата JavaDoc
- Локальное время javadoc
- Период JavaDoc
- Java 8 – Как отформатировать LocalDateTime
- Java 8 – Примеры периодов и продолжительности
- Java 8 – Разница между двумя локальными датами или локальным временем
- Java – Проверьте, не старше ли дата 6 месяцев
Оригинал: “https://mkyong.com/java/how-to-compare-dates-in-java/”