如何在Java 8中比较LocalDate实例

89

我正在编写一个需要在日期上非常准确的应用程序,我想知道如何比较LocalDate实例.. 目前我使用的是类似以下的代码:

LocalDate localdate1 = LocalDate().now();
LocalDate localdate2 = someService.getSomeDate();
localdate1.equals(localdate2);

但我注意到我的应用程序给我一些令人困惑的结果,我认为这是由于日期比较造成的。

我正在考虑从1970年开始获取时间并将其转换为长整型进行比较,但我必须要更简单,我肯定可以做到。


什么样的混淆结果?equals的文档说:“比较...确保日期相同”。在你的情况下,这听起来像是正确的事情。 - Lii
这是我的错误,问题的根源在于其他地方,但我仍然很好奇这是否是比较LocalDates的适当方式 :) - azalut
1
关于您使用1970年的纪元计数的想法,请避免这样做。这会让人感到困惑且难以调试。现代的java.time类消除了任何需要进行这种笨拙处理的必要性。 - Basil Bourque
对于许多情况,我更倾向于使用isEqual()。如果你的两个对象都是LocalDate类型,它将给出与equals()相同的结果,这正是你想要的。如果其中一个对象是另一个日历系统(比如伊斯兰教历)中的日期,equals()将返回false,而isEqual()仍然能正确判断这两个日期是否表示同一天。 - undefined
3个回答

129
使用equals()时,LocalDate会重写equals:
int compareTo0(LocalDate otherDate) {
    int cmp = (year - otherDate.year);
    if (cmp == 0) {
        cmp = (month - otherDate.month);
        if (cmp == 0) {
            cmp = (day - otherDate.day);
        }
    }
    return cmp;
}

如果您对equals()方法的结果不满意,可以使用LocalDate预定义的方法: 请注意,所有这些方法都使用compareTo0()方法并仅检查cmp值。如果您仍然得到奇怪的结果(这不应该发生),请提供输入和输出示例。

1
“将比较对象”这句话我觉得有点难理解,您的意思是什么?LocalData.equalsLocalDate.isEqual有什么不同?您的回答可以多加一些解释。 - Lii
@Lii,你可以查看我的更新答案。我已经删除了之前的编辑并添加了更多信息。 - royB
所有这些方法都使用compareTo0()方法。这很有趣!这是否意味着equalsisEqualcompareTo(other) == 0是等效的?文档不太清楚。 - Lii
3
equalsisEquals都使用return compareTo0((LocalDate) obj) == 0;的代码,因此是的。两者的区别在于,equals首先检查instanceOf,而isEqual是强类型到ChronoLocalDate - royB
@Lii @royB 我只是想指出equals()接受一个Object,并且如果您传递的东西不是LocalDate的实例,它将返回false。 - ItachiUchiha

5
LocalDate ld ....;
LocalDateTime ldtime ...;

ld.isEqual(LocalDate.from(ldtime));

4
欢迎来到Stack Overflow!尽管这可能回答了问题,但您的代码没有说明。请更新您的答案,提供您正在做什么的解释。谢谢! - Miroslav Glamuzina

0

我相信这段代码片段在日期比较跨越两个以上条目的情况下也会很有帮助。

static final int COMPARE_EARLIEST = 0;

static final int COMPARE_MOST_RECENT = 1;


public LocalDate getTargetDate(List<LocalDate> datesList, int comparatorType) { 
   LocalDate refDate = null;
   switch(comparatorType)
   {
       case COMPARE_EARLIEST:         
       //returns the most earliest of the date entries
          refDate = (LocalDate) datesList.stream().min(Comparator.comparing(item -> 
                      item.toDateTimeAtCurrentTime())).get();
          break;

       case COMPARE_MOST_RECENT:
          //returns the most recent of the date entries 
          refDate = (LocalDate) datesList.stream().max(Comparator.comparing(item -> 
                    item.toDateTimeAtCurrentTime())).get();
          break;
   }

   return refDate;
}

@Chan Tan:感谢你的编辑,需要一点时间来适应内容编辑格式。 - Chigozie D.
1
这段代码很脆弱。我不建议使用它。特别是如果它在本地日期从一天转换到下一天时正在运行,使用toDateTimeAtCurrentTime会出现问题。 - JakeRobb
LocalDate类中不存在toDateTimeAtCurrentTime方法。 - belgoros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接