How to Compare Dates in Java

17 Mar 2025 | 6 分钟阅读

Java 中,当我们处理日期时间时,有时需要比较日期Java 中日期的比较不像数字的比较那么直接。因此,在 Java 中比较两个日期是一项有点棘手的任务。我们不需要自己实现任何逻辑来比较日期。为了使这项任务更轻松,Java 提供了 compareTo()、before()、after()equals() 方法。在本节中,我们将学习如何在 Java 中比较两个日期

Java 中有四个类提供了比较两个日期的方法。

  • 使用 compareTo() 方法
  • 使用 Date
  • 使用 Calendar
  • 使用 LocalDate

使用 Date.compareTo() 方法

Java Date 类 提供了与时间和日期相关的各种方法。它是 java.util 包中的一个类。该类实现了 Serializable、Cloneable 和 Comparable<Date> 接口。

对于两个日期的比较,该类提供了 compareTo() 方法。它按顺序比较日期。它将(要比较的)日期解析为一个参数。如果参数日期为 null,则抛出 NullPointerException

语法

它返回整数值

  • 0: 如果两个日期相等。
  • 小于 0 的值: 如果该日期在参数日期之前。
  • 大于 0 的值: 如果该日期在参数日期之后。

请记住: 如果你在 Java 中处理日期,请不要忘记导入 java.text.SimpleDateFormat、java.text.ParseException、java.util.Date

让我们来实现 compareTo() 方法并比较两个日期。

在以下示例中,我们创建了一个 SimpleDateFormat 类的实例,它允许我们处理不同的日期格式。之后,我们创建了两个 Date 类型的变量 date1date2。通过使用 SimpleDateFormat 类的 parse() 方法,我们解析了要比较的日期。该方法返回从字符串解析的 date。我们将 Date 类型的 date1 和 date2 变量传递给 format() 方法。该方法给出格式化的日期/时间字符串。

为了比较两个日期,我们使用了 compareTo() 方法。如果两个日期相等,它将打印 两个日期相等。 如果 date1 大于 date2,它将打印 日期 1 在日期 2 之后。如果 date1 小于 date2,它将打印 日期 1 在日期 2 之后

CompareDatesExample1.java

输出

Date 1: 2020-07-20
Date 2: 2020-06-18
Date 1 comes after Date 2

使用 Date 类

Java 的 date 类提供了 before()after()equals() 方法 来比较两个日期。

before(): 该方法检查日期是否在指定日期之前。它解析 Date 类型的参数。当表示的时间瞬间严格早于此 Date 对象表示的时间瞬间时,它返回 true,否则返回 false

语法

如果 when 为 null,则抛出 NullPointerException

after(): 该方法检查日期是否在指定日期之后。它解析 Date 类型的参数。当表示的时间瞬间严格晚于此 Date 对象表示的时间瞬间时,它返回 true,否则返回 false

语法

如果 when 为 null,则抛出 NullPointerException

equals(): 该方法检查(比较)两个日期的相等性。它重写了 Object 类的 equals() 方法。如果对象相同,则返回 true,否则返回 false。因此,当且仅当 getTime() 方法为两个日期返回相同的 long 值时,Date 对象才相等。

语法

让我们在示例中使用上述解释的方法,并通过这些方法来比较两个日期。

CompareDatesExample2.java

输出

Date1: 2019-01-01
Date2: 2020-01-01
Date1 comes before Date2

使用 Calendar 类

与 Java Date 类一样,Calendar 类 也提供了 before()after()equals() 方法。这三个方法的签名与我们上面解释的相同。

让我们使用 Calendar 类,并通过 after()、before() 和 equals() 方法来比较两个日期。

在下面的示例中,我们使用了与上一个示例相同的方法,除了 getInstance()setTime() 方法。

getInstance(): 它是 Calendar 的一个静态方法。它返回一个使用默认时区和区域设置的 Calendar。

语法

setTime(): 该方法根据指定的日期设置日历时间。它解析 Date 类型的参数。

语法

CompareDatesExample3.java

输出

Date1: 2020-12-01
Date2: 2020-12-01
Both dates are equal

使用 LocalDate 类

Java 提供了另一个 LocalDate 类来比较两个 LocalDate、LocalTime 和 LocalDateTime。它是 java.time 包的成员。该类提供 isBefore()、isAfter()、isEquals() 和 compareTo() 方法来比较日期。这些方法与 Date 和 Calendar 类的 before()、after() 和 equals() 方法的工作方式相同。

让我们在示例中使用 LocalDate 类来比较两个日期。

在下面的示例中,我们使用了以下方法来比较两个日期。所有方法都根据本地时间线来检查日期。

of(): 它是 LocalDate 类的静态方法。它从年、月和日获取 LocalDate 的实例。它接受三个 int 类型的参数 year、month 和 date。它返回具有指定日期的 LocalDate。

语法

其中

year: 必须在 MIN_YEAR 到 MAX_YEAR 之间。

month: 必须在 1(一月)到 12(十二月)之间。

dayOfMonth: 必须在 1 到 31 之间。

如果任何参数的值超出范围,则抛出 DateTimeException。

isBefore(): 该方法检查日期是否在指定日期之前。它将(要比较的)日期解析为一个参数。仅当日期在指定日期之前时,它才返回 true。其比较方法与 compareTo(ChronoLocalDate) 不同。

语法

isAfter(): 该方法检查日期是否在指定日期之前。它将(要比较的)日期解析为一个参数。仅当日期在指定日期之前时,它才返回 true。其比较方法与 compareTo(ChronoLocalDate) 不同。

语法

isEqual(): 该方法比较日期是否相等。如果两个日期相等,则返回 true,否则返回 false。它将(要比较的)日期解析为一个参数。

仅当日期在指定日期之前时,它才返回 true。其比较方法与 compareTo(ChronoLocalDate) 不同。

语法

CompareDatesExample4.java

输出

Date1: 2020-09-29
Date2: 2020-12-07
Date1 comes before Date2