Java中比较两个日期的大小

后端 潘老师 6个月前 (10-31) 143 ℃ (0) 扫码查看

学习在Java中比较两个给定的日期,以确定哪个日期在时间线上更早,哪个更晚。我们将通过以下类来看日期比较的例子:

  • Java 8中的LocalDate、LocalDateTime和ZonedDateTime类
  • Java 7及之前的Date和Calendar类

1.Java 8及以后的日期比较

1.1 核心类

Java 8中最常用的日期类是:

  • java.time.LocalDate – 只有日期,没有时间和时区。
  • java.time.LocalDateTime – 只有日期和时间,没有时区。
  • java.time.ZonedDateTime – 日期和时间,有时区。
  • java.time.Instant – 自纪元(1970年1月1日UTC午夜)以来经过的秒数。

1.2 如何比较日期大小

以上所有类都有比较两个实例自己的方法,即isAfter()、isBefore()、isEqual()和compareTo()。

  • date1.isAfter(date2) – 如果date1在date2之后返回true;否则返回false。
  • date1.isBefore(date2) – 如果date1在date2之前返回true;否则返回false。
  • date1.isEqual(date2) – 如果date1等于date2返回true;否则返回false。
  • date1.compareTo(date2) – 如果date1在date2之后返回“正数”;否则返回“负数”。值为“0”表示两个日期都相等。

需要注意的是:

  • 如果我们只想比较日期部分,而不关心时间部分,则使用LocalDate实例。
  • LocalDateTime和ZonedDateTime也会比较时间部分,所以即使它们代表的日期是相同的日历日,如果时间不同,它们也不相等。
  • 使用toLocalDate()从LocalDateTime和ZonedDateTime实例中获取日期部分。

1.3 示例

Java程序用于比较两个LocalDate类的实例。

LocalDate today = LocalDate.now();
LocalDate anotherDay = LocalDate.of(2018, 01, 10);
System.out.println(today.isEqual(anotherDay));        //false
System.out.println(today.isAfter(anotherDay));        //true
System.out.println(today.isBefore(anotherDay));        //false
int diff = today.compareTo(anotherDay);
if(diff > 0) {
    System.out.println(today + " is greater than " + anotherDay);
} else if (diff < 0) {
    System.out.println(today + " is less than " + anotherDay);
} else {
    System.out.println(today + " is equal to " + anotherDay);
}

Java程序用于比较两个LocalDateTime实例。

LocalDateTime instance = LocalDateTime.now();
// 在两个实例中都有不同的时间部分
Thread.currentThread().sleep(100);
LocalDateTime anotherInstance = LocalDateTime.now();
// 仅比较日期部分
boolean isEqual = instance.toLocalDate()
  .isEqual(anotherInstance.toLocalDate());
System.out.println(isEqual);    //true
// 比较日期和时间
System.out.println(instance.isEqual(anotherInstance)); // false
System.out.println(instance.isAfter(anotherInstance)); // false
System.out.println(instance.isBefore(anotherInstance)); // true

Java程序比较两个ZonedDateTime实例。请注意,使用compareTo()进行的比较首先基于瞬时值,然后基于本地日期时间,再基于时区ID,最后基于年代。换句话说,它会比较两个实例的所有日期和时间字段。因此,如果两个实例在宇宙时间线上完全相同的时间,但它们在不同的时区,则compareTo()方法不会返回零。
为了正确比较两个ZonedDateTime相对于纪元时间,请比较zdt.toInstant()字段。或者我们可以使用isBefore(),isEqual()或isAfter()方法来比较纪元秒。

ZonedDateTime now = ZonedDateTime.now();
//如果我们想在不同的时区中转换为同一时刻
ZonedDateTime nowInUTC = now.withZoneSameInstant(ZoneId.of("UTC"));
ZonedDateTime zdtInUTC = ZonedDateTime
  .parse("2022-02-15T11:21:12.123+05:30[UTC]");
long difference = nowInUTC.toInstant()
        .compareTo(zdtInUTC.toInstant());
if (difference > 0) {
  System.out.println("zoneddatetime1 > zoneddatetime2");
} else if (difference < 0) {
  System.out.println("zoneddatetime1 < zoneddatetime2");
} else {
  System.out.println("\"zoneddatetime1 = zoneddatetime2");
}

2.Java 7及之前的日期比较

2.1 核心类

Java 7之前最常用的日期类是:

  • java.util.Date
  • java.util.Calendar

2.2 比较方法

Date和Calendar类都有before()、after()、equals()和compareTo()等方法用于日期比较。

  • date1.after(date2) – 如果date1在date2之后返回true;否则返回false。
  • date1.before(date2) – 如果date1在date2之前返回true;否则返回false。
  • date1.equals(date2) – 如果date1和date2相等返回true;否则返回false。
  • date1.compareTo(date2) – 如果date1在date2之后返回“正数”;否则返回“负数”。值为“0”表示两个日期都相等。

注意:Date和Calendar类都有时间部分,上述方法都会使用时间部分进行比较。因此,如果您只想比较日期部分而不关心时间部分,则需要从其他实例中提取day / month / year信息并将其逐一进行比较。

2.3 比较日期实例

在给定的代码中,我们首先比较了两个日期实例,包括它们的时间部分。

Date date1 = new Date();
// 两个实例的时间部分不同
Thread.currentThread().sleep(100);
Date date2 = new Date();
System.out.println(date1.equals(date2)); // false
System.out.println(date1.after(date2)); // false
System.out.println(date1.before(date2)); // true

现在我们将仅比较这两个日期的日期部分,不包括与实例相关联的任何时间部分。我们使用Calendar类从Date实例中提取天、月和年的信息。

Date date1 = new Date();
Thread.currentThread().sleep(100);
Date date2 = new Date();
int diff = compareDatePartOnly(date1, date2);
if (diff > 0) {
  System.out.println(date1 + " is greater than " + date2);
} else if (diff < 0) {
  System.out.println(date1 + " is less than " + date2);
} else {
  System.out.println(date1 + " is equal to " + date2);
}
private static int compareDatePartOnly(final Date date1, final Date date2) {
    Calendar cal1 = Calendar.getInstance();
    Calendar cal2 = Calendar.getInstance();
    cal1.setTime(date1);
    cal2.setTime(date2);
    int result = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
    if (result == 0) {
      result = cal1.get(Calendar.DAY_OF_YEAR) - cal2.get(Calendar.DAY_OF_YEAR);
    }
    return result;
}

以上就是Java中比较两个日期的大小的全部方法,包括java8及以后的版本如何比较日期时间大小,以及java7及以前的版本如何比较日期时间大小,希望对你有帮助。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10518.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】