Рубрики
Без рубрики

Как сравнить даты в Java

Несколько примеров показывают, как сравнить устаревшую дату и календарь и Java 8 LocalDate, LocalDateTime, Instant и т. Д.

В этой статье показано несколько примеров сравнения двух дат на 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 месяцев .

Рекомендации

Оригинал: “https://mkyong.com/java/how-to-compare-dates-in-java/”