一、背景
本文将介绍比较两个 java.util.Date 对象是不是代表同一天的N种姿势。
首先介绍 Java自带 API实现,然后会介绍几种类库实现该功能。
译者:比较两个对象是否是同一天本身难度不是很大,重点提醒大家多了解用到的其他类库,未来更多时间相关的功能需求,可以通过相关类库更方便地处理。
二、Java核心类库
Date类表示特定的时间瞬间,精度为毫秒。
为了找出两个Date对象是否包含同一天,我们需要检查两个对象的Year-Month-Day是否相同,丢弃更细粒度的时间等。
2.1. 使用 LocalDate
使用Java 8的新的Date-Time API,我们可以使用LocalDate对象。 这是一个不可变的对象,表示不包含时间的日期对象。
让我们看看如何使用此类检查两个Date对象是否具有同一天:
public static boolean isSameDay(Date date1, Date date2) { LocalDate localDate1 = date1.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate localDate2 = date2.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); return localDate1.isEqual(localDate2); }
在此示例中,我们使用默认时区将两个Date对象都转换为LocalDate。 转换后,我们只需要使用isEqual方法检查LocalDate对象是否相等。
因此,使用这种方法,我们将能够确定两个Date对象是否为同一天。
2.2. 使用SimpleDateFormat
从Java的早期版本开始,我们已经能够使用SimpleDateFormat类在Date和String对象表示形式之间进行转换。 此类附带使用多种模式的转换功能。
在我们的例子中,我们将使用模式“ yyyyMMdd”。
使用此方法,我们将格式化日期,将其转换为String对象,然后使用标准的equals方法进行比较:
public static boolean isSameDay(Date date1, Date date2) { SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); return fmt.format(date1).equals(fmt.format(date2)); }
2.3. 使用Calendar
Calendar类提供了获取不同日期时间单位的值时间的方法。
首先,我们需要创建两个Calendar实例,并根据每个日期设置Calendar对象的时间。
然后,我们可以分别查询和比较Year-Month-Day属性,以确定Date对象是否具有同一天:
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); }
三. 三方类库
通过上面的例子,我们通过 Java 新的和旧的 API 对比 两个 Java 日期对象是否为同一天。
下面我们将使用三方类库实现相同的功能。
3.1. 使用Apache Commons Lang包的 DateUtils
DateUtils类提供了很多丰富的时间类,用它来处理Calendar 和 Date对象就非常容易。
maven 依赖:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency>
一句话搞定:
DateUtils.isSameDay(date1, date2);
3.2. Joda-Time 类库
Joda-Time 提供了强大的日期时间功能,可以替代 Java 的 日期时间相关类。
maven依赖
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency>
用法:
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); }
3.3. Date4J 库
Date4J 也提供了很多时间相关的 API。
maven依赖
<dependency> <groupId>com.darwinsys</groupId> <artifactId>hirondelle-date4j</artifactId> <version>1.5.1</version> </dependency>
我们可以将 java.util.Date 转为DateTime 对象,然后使用 isSameDayAs来比较:
public static boolean isSameDay(Date date1, Date date2) { DateTime dateObject1 = DateTime.forInstant(date1.getTime(), TimeZone.getDefault()); DateTime dateObject2 = DateTime.forInstant(date2.getTime(), TimeZone.getDefault()); return dateObject1.isSameDayAs(dateObject2); }
4 总结
本文介绍了比较 两个 Java 日期对象是否为同一天的不同方式。
希望大家多了解常见的时间工具类,在有类似需求的情况下使用知名的三方时间工具类来简化代码。
原文:https://www.baeldung.com/java-check-two-dates-on-same-day
---------------------------------
另外想学习,更多开发和避坑技巧,少走弯路,请关注《阿里巴巴Java 开发手册》详解专栏
共同学习,写下你的评论
评论加载中...
作者其他优质文章