章
目
录
学习在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及以前的版本如何比较日期时间大小,希望对你有帮助。