当使用 date before方法比较两个日期时,如果日期相似,则返回 false,如下所示:
- 日期 1:2012 年 12 月 18 日星期二 00:00:00 GMT+02:00
- 日期 2:2012 年 12 月 18 日星期二 00:00:00 GMT+02:00
在这种情况下,该方法date1.before(date2)
总是返回 false,这对我来说没有意义(换句话说,不适用于我的情况)。我想检查日期(日/月/年)是否等于今天的日期(日/月/年)?
因为date1.equals(date2)
,date1.before(date2)
返回 false 是正常的。会做date1.after(date2)
的。
两个日期相同,所以一个不在另一个之前。
从javadoc:
当且仅当此 Date 对象表示的时刻严格早于 when 表示的时刻时,才为真;否则为假。
尝试类似:
if(date1.before(date2) || date1.equals(date2)) ...
下面提供的答案建议测试逆向,它们是正确的:
if(!date1.after(date2)) ...
两种测试是等效的。
您可以简单地测试逆:
!date1.after(date2)
您始终可以通过这种方式将严格的订单检查转换为非严格的检查。由于数学上:
a > b ⇔ ¬ (a ≤ b)
如果日期相等,那么显然一个不在另一个之前:false is the correct return for date1.before(date2) where date1 == date2
.
如果你需要包括平等,为什么不做一个否定.after()
(显然如果日期 1 不是在日期 2 之后,那么它等于或之前),但我会确保这实际上是你想要完成的正确逻辑.
如果相等是需要以不同方式处理的特殊情况,则对.equals()
.
您可以像 bowmore 提出的那样使用逆:!date1.after(date2)
或者,如果您正在寻找范围,between 可以包括端点,在这种情况下,您可以use return !d.before(min) && !d.after(max)
您也可以使用它:
boolean check = dateOne.before(dateTwo) || DateUtils.isSameDay(dateOne, dateTwo);
DateUtils 来自org.apache.commons.lang.time包
您的代码的真正问题可能是您没有考虑到 millis 和 before 函数
带有 toString 结果的两个对象 java.util.Date:Sun Aug 28 00:00:00 CEST 2016 在调用 getTime 时可能具有不同的值。例如
Date d1;
Date d2;
d1.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d2.toString(); // = Sun Aug 28 00:00:00 CEST 2016
d1.getTime(); // = 1472335200605
d2.getTime(); // = 1472335200000
当然,这些日期并不相等。
来自 javadoc:
“返回:当且仅当此 Date 对象表示的时刻严格早于 when 表示的时刻时才返回 true;否则返回 false。”
这是一种非常正常的行为,因为dateBefore
检查一个日期是否在另一个日期之前。如果日期相同,这显然是错误的。
您可以使用Date.compareTo()
.
这里的值是:
示例代码是:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = sdf.parse("2009-12-31");
Date date2 = sdf.parse("2010-01-31");
System.out.println("date1 : " + sdf.format(date1));
System.out.println("date2 : " + sdf.format(date2));
if (date1.compareTo(date2) > 0) {
System.out.println("Date1 is after Date2");
} else if (date1.compareTo(date2) < 0) {
System.out.println("Date1 is before Date2");
} else if (date1.compareTo(date2) == 0) {
System.out.println("Date1 is equal to Date2");
} else {
System.out.println("How to get here?");
}
有关更多详细信息,您可以访问此线程
2012 年的答案是正确的,并且在当时通常是很好的答案。现在我们肯定更喜欢使用 java.time,现代 Java 日期和时间 API,而不是Date
问题中隐含的类。Date
设计不佳,现在早已过时。
获得“之前或相等”比较的两种推荐方法是:
自然而罗嗦的一个:
OffsetDateTime dateTime1 = OffsetDateTime.of(2012, 12, 18, 0, 0, 0, 0, ZoneOffset.ofHours(2));
OffsetDateTime dateTime2 = OffsetDateTime.of(2012, 12, 18, 0, 0, 0, 0, ZoneOffset.ofHours(2));
if (dateTime1.isBefore(dateTime2) || dateTime1.isEqual(dateTime2)) {
System.out.println("dateTime1 is before or equal to dateTime2");
} else {
System.out.println("dateTime1 is after dateTime2");
}
输出是:
dateTime1 早于或等于 dateTime2
顺便OffsetDateTime.isEqual()
说一句,比较时间点、瞬间、跨 UTC 偏移量并将返回 true 的两个对象表示相同的时间点。也isBefore()
适用于不同的 UTC 偏移量。
我们颠倒条件的简短说明:
if (dateTime1.isAfter(dateTime2)) {
System.out.println("dateTime1 is after dateTime2");
} else {
System.out.println("dateTime1 is before or equal to dateTime2");
}
输出和以前一样。
根据要求,您很容易发现自己更喜欢Instant
该类而不是OffsetDateTime
. if
条件将是相同的。
无论是使用老式的Date
还是现代的类之一,都意味着严格地从前。因此,要获得之前或相等,我们需要使用上述变体之一。