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 与 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);
}