java 如果两个日期相等,则Date before方法返回false

nzk0hqpo  于 2023-08-01  发布在  Java
关注(0)|答案(9)|浏览(347)

使用date before方法比较两个日期时,如果日期相似,则返回false,如下所示:

*日期1:周二12月18日00:00:00 GMT+02:00 2012
*日期2:周二12月18日00:00:00 GMT+02:00 2012

方法date1.before(date2)在这种情况下总是返回false,这对我来说没有意义(换句话说,不适用于我的情况)。我想检查日期(日/月/年)是否等于今天的日期(日/月/年)?

4c8rllxm

4c8rllxm1#

作为date1.equals(date2)date1.before(date2)返回false是正常的。就像date1.after(date2)一样。
两个日期是相同的,所以一个不在另一个之前。
关于javadoc
true当且仅当此Date对象表示的时刻严格早于when表示的时刻;否则为false。
尝试以下操作:

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

字符串
下面提供的答案建议测试相反的情况,他们是正确的:

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


两种测试是等效的。

zsohkypk

zsohkypk2#

您可以简单地测试逆:

!date1.after(date2)

字符串
您始终可以通过这种方式将严格顺序检查转换为非严格检查。因为数学上:

a > b ⇔ ¬ (a ≤ b)

nnt7mjpx

nnt7mjpx3#

如果日期相等,则显然一个不在另一个之前:false is the correct return for date1.before(date2) where date1 == date2
如果你需要 * 包含 * 相等,为什么不在.after()上做一个否定(显然,如果日期1不在日期2之后,那么它是 * 等于或之前 *),但我会确保这实际上是正确的逻辑,你试图完成。
如果相等是一种特殊情况,需要以不同的方式处理,那么对.equals()进行单独的测试。

oxf4rvwz

oxf4rvwz4#

你可以使用鲍莫尔提出的相反方法:第一个月
或者,如果要查找范围,between可以包括端点,在这种情况下,可以使用use return !d.before(min) && !d.after(max)

ilmyapht

ilmyapht5#

你也可以使用这个:

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

字符串
DateUtils来自org.apache.commons.lang.time

sqserrrh

sqserrrh6#

代码的真实的问题可能是没有考虑米利斯和before函数
两个对象java.util.Date,带有toString结果: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:

“返回:true当且仅当此Date对象表示的时刻严格早于when表示的时刻;否则为假”。

knpiaxh1

knpiaxh17#

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

ukxgm1gy

ukxgm1gy8#

Assertj的isBeforeOrEqualTo是一个测试选项。

0mkxixxg

0mkxixxg9#

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偏移量下工作。
1.简单的一个,我们反转条件:

if (dateTime1.isAfter(dateTime2)) {
        System.out.println("dateTime1 is after dateTime2");
    } else {
        System.out.println("dateTime1 is before or equal to dateTime2");
    }


输出和以前一样。
根据需求,您很容易发现自己更喜欢Instant类而不是OffsetDateTimeif的条件也是一样的。
无论是使用老式的Date还是现代类中的一个 before 都意味着 * 严格before*。因此,要获得 before或equal,我们需要使用上面的变体之一。

相关问题