如何比较Java 8的LocalDate实例


72

我正在编写一个日期需要非常准确的应用程序,我想知道如何比较LocalDate实例。

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

但是我注意到我的应用程序给了我一些令人困惑的结果,并且我认为是因为比较日期。

我正在考虑长时间获取从1970'开始的时间并比较这两个时间,但我一定会更轻松,我敢肯定


什么样的结果令人困惑?equals“比较...确保日期相同”的dox 。这听起来像您的情况是正确的。
2015年

这是我的错,问题的根源在于其他问题,但是我仍然很好奇这是否是比较LocalDates的适当方式:)
azalut 2015年

至于您想使用1970年的从时代开始的想法,请避免这样做。这令人困惑并且难以调试。现代的java.time类消除了这种笨拙处理的任何需求。
罗勒·布尔克

Answers:


108

使用确实覆盖等于:equals() LocalDate

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.equals不同LocalDate.isEqual?您的答案可能需要更多解释。
2015年

@Lii,您可以检查我的最新答案。我已经删除了之前的修改并添加了更多信息
-royB 2015年

“所有这些方法都在使用该compareTo0()方法。” 那很有意思!这是否意味着equalsisEqualcompareTo(other) == 0 是等价的?文档有点不清楚。
2015年

3
equalsisEquals两个使用return compareTo0((LocalDate) obj) == 0;如此肯定的。该差异是等于第一次检查instanceOf,而isEqual被强类型化为ChronoLocalDate
royB

@Lii @royB我只想声明一个equals()接受Object,如果传递的不是实例,则返回false LocalDate
ItachiUchiha 2015年

2
LocalDate ld ....;
LocalDateTime ldtime ...;

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

3
欢迎使用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檀:谢谢你的编辑,需要一些小的,而与内容编辑打印格式acclamatize ..
Chigozie D.

1
此代码易碎。我不建议使用它。特别是,如果在本地日期从一天过渡到第二天的同时恰好正在运行,则使用toDateTimeAtCurrentTime会出现问题。
JakeRobb

方法toDateTimeAtCurrentTimeLocalDate类中不存在。
belgoros
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.