校验两个Java Date是不是同一天的N种姿势

101 篇文章 25 订阅
66 篇文章 2 订阅

一、背景

本文将介绍比较两个 java.util.Date 对象是不是代表同一天的N种姿势。

首先介绍 Java自带 API实现,然后会介绍几种类库实现该功能。

译者:比较两个对象是否是同一天本身难度不是很大,重点提醒大家多了解用到的其他类库,未来更多时间相关的功能需求,可以通过相关类库更方便地处理。

 

二、Core 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);
}

3. 外部库

通过上面的例子,我们通过 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 日期对象是否为同一天的不同方式。

希望大家多了解常见的时间工具类,在有类似需求的情况下使用知名的三方时间工具类来简化代码。

 

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断两个日期是否同一天,可以使用不同的方法。引用中提供了两方法。第一方法使用了commons-lang包下的DateUtils类的isSameDay()方法来判断,该方法会比较两个日期的年、月、日是否相同。第二方法使用了joda依赖包里的时间类,将日期转换为LocalDate对象,并通过比较两个LocalDate对象是否相等来判断日期是否同一天。 另外,引用还提到了使用Year-Month-Day来判断两个日期是否同一天,丢弃更细粒度的时间。 综上所述,要判断两个日期是否同一天,可以使用以上方法中的任意一。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [java时间戳与Date相互转换、日期格式化、给日期加上指定时长、判断两时间点是否同一天](https://blog.csdn.net/fanrenxiang/article/details/80531649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [校验两个Java Date是不是同一天的N姿势](https://blog.csdn.net/w605283073/article/details/103335373)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值