Java 判断两个 Date 是否为同一天

Java 的日期时间类型 Date 在项目中使用十分广泛,而本身 Date 是包含年月日时分秒的。有时,我们只关心两个时间是否为同一天,也就是不关注时分秒的部分。

要确定两个Date对象是否为同一天,我们需要检查两个对象的 Year-Month-Day 是否相同,并丢弃 time。

SimpleDateFormat

使用 SimpleDateFormat 类在 Date 和 String 对象之间进行转换。我们将时间格式定义为只包含年月日的模式,如“yyyyMMdd”,然后比较两个字符串即可。

public static boolean isSameDay(Date date1, Date date2) {
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
    return fmt.format(date1).equals(fmt.format(date2));
}

这样相当于字符串的比较,并且只包含年月日部分比较。

Calendar

Calendar 类提供了获取特定时刻的不同日期时间单位的值的方法。

首先,我们需要创建一个 Calendar 实例并使用每个提供的日期设置 Calendar 对象的时间。然后我们可以单独查询和比较年月日属性,以确定日期对象是否具有同一天:

public static boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR)
      && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH)
      && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
}

可以看出,使用 Calendar 会显得些许笨重。

LocalDate

使用 Java 8 的新日期时间 API,我们可以使用LocalDate对象。这是一个不可变对象,表示没有时间的日期。

让我们看看如何使用此类检查两个Date对象是否具有同一天:

private static void localDateSameDay(Date date1, Date date2) {
    LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault())
            .toLocalDate();
    LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault())
            .toLocalDate();
    boolean isSameDay = localDate1.isEqual(localDate2);
    System.out.printf("时间 %s 与 %s 是否为同一天 %s \n", date1, date2, isSameDay);
}

我们将两个 Date 对象使用默认时区都转换为LocalDate。转换后,我们只需要使用 isEqual() 方法检查 LocalDate 对象是否相等。
为了便于观察结果,我们将比较后的值输出到控制台,实际开发中,只需要将 isEqual() 的值作为方法的返回即可。

时间 Mon Apr 04 04:50:02 CST 2022 与 Mon Apr 04 07:20:51 CST 2022 是否为同一天 true
时间 Mon Apr 04 04:50:02 CST 2022 与 Wed Apr 06 16:06:05 CST 2022 是否为同一天 false

Apache Commons Lang

在第三方库 Apache Commons Lang 中,有个 DateUtils 工具类,提供了非常多实用的日期操作方法。

为了使用 Apache Commons Lang,我们需要将它作为依赖项包含在pom.xml文件中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

然后我们可以简单地使用 DateUtils 中的 isSameDay() 方法:

DateUtils.isSameDay(date1, date2);

这也是使用代码量最少的方案。

Joda-Time

如果项目中 JDK 的版本没升级到 Java8,Joda-Time 将是日期和时间库的最佳替代方案。

为了使用 Joda-Time,我们需要将它作为依赖项包含在pom.xml文件中:

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10.14</version>
</dependency>

在这个库中,org.joda.time.LocalDate 表示没有时间的日期。因此,我们可以从 java.util.Date 对象构造 LocalDate 对象,然后比较它们:

public static boolean isSameDay(Date date1, Date date2) {
    org.joda.time.LocalDate localDate1 = new org.joda.time.LocalDate(date1);
    org.joda.time.LocalDate localDate2 = new org.joda.time.LocalDate(date2);
    return localDate1.equals(localDate2);
}
标签: