42

当使用 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,这对我来说没有意义(换句话说,不适用于我的情况)。我想检查日期(日/月/年)是否等于今天的日期(日/月/年)?

4

9 回答 9

89

因为date1.equals(date2)date1.before(date2)返回 false 是正常的。会做date1.after(date2)的。

两个日期相同,所以一个不在另一个之前。

javadoc

当且仅当此 Date 对象表示的时刻严格早于 when 表示的时刻时,才为真;否则为假。

尝试类似:

if(date1.before(date2) || date1.equals(date2)) ...

下面提供的答案建议测试逆向,它们是正确的:

if(!date1.after(date2)) ...

两种测试是等效的。

于 2012-12-18T15:51:33.497 回答
57

您可以简单地测试逆:

!date1.after(date2)

您始终可以通过这种方式将严格的订单检查转换为非严格的检查。由于数学上:

a > b ⇔ ¬ (a ≤ b)
于 2012-12-18T19:23:16.073 回答
8

如果日期相等,那么显然一个不在另一个之前:false is the correct return for date1.before(date2) where date1 == date2.

如果你需要包括平等,为什么不做一个否定.after()(显然如果日期 1 不是在日期 2 之后,那么它等于或之前),但我会确保这实际上是你想要完成的正确逻辑.

如果相等是需要以不同方式处理的特殊情况,则对.equals().

于 2012-12-18T16:00:01.193 回答
6

您可以像 bowmore 提出的那样使用逆:!date1.after(date2)

或者,如果您正在寻找范围,between 可以包括端点,在这种情况下,您可以use return !d.before(min) && !d.after(max)

于 2014-01-03T16:04:15.120 回答
4

您也可以使用它:

boolean check = dateOne.before(dateTwo) || DateUtils.isSameDay(dateOne, dateTwo);

DateUtils 来自org.apache.commons.lang.time

于 2015-10-13T08:33:55.520 回答
2

您的代码的真正问题可能是您没有考虑到 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。”

于 2016-08-28T17:07:31.437 回答
1

这是一种非常正常的行为,因为dateBefore检查一个日期是否在另一个日期之前。如果日期相同,这显然是错误的。

于 2012-12-18T15:51:14.707 回答
0

您可以使用Date.compareTo().

这里的值是:

  1. 如果两个日期相等,则返回值为 0。
  2. 如果 Date 在 date 参数之后,则返回值大于 0 。
  3. 如果 Date 在 date 参数之前,则返回值小于 0。

示例代码是:

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?");
        }

有关更多详细信息,您可以访问此线程

于 2020-08-11T08:03:06.907 回答
0

2012 年的答案是正确的,并且在当时通常是很好的答案。现在我们肯定更喜欢使用 java.time,现代 Java 日期和时间 API,而不是Date问题中隐含的类。Date设计不佳,现在早已过时。

获得“之前或相等”比较的两种推荐方法是:

  1. 自然而罗嗦的一个:

        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 偏移量。

  2. 我们颠倒条件的简短说明:

        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还是现代的类之一,都意味着严格地从前。因此,要获得之前或相等,我们需要使用上述变体之一。

于 2020-08-11T19:58:08.023 回答