88

I am writing an app that needs to be quite accurate in dates and I wonder how can I compare LocalDate instances.. for now I was using something like:

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

But I noticed that my app is giving me some confusing results, and I think it is because of the date comparing.

I am thinking about obtaining the time from 1970' in long and compare those two, but I must be easier, I am sure of it

Honza Zidek
  • 9,204
  • 4
  • 72
  • 118
azalut
  • 4,094
  • 7
  • 33
  • 46
  • What kind of confusing results? The dox for `equals` say _"Compares ... ensuring that the date is the same"_ . That sounds like the right thing in your case. – Lii Mar 23 '15 at 08:09
  • It was my mistake, the source of the problem laid in something another, however I am still curious if this is an appropriate manner to compare LocalDates :) – azalut Mar 23 '15 at 23:06
  • As for your idea of using a count-from-epoch of 1970, avoid doing that. It is confusing and difficult to debug. The modern java.time classes eliminate any need for such awkward handling. – Basil Bourque Jul 30 '17 at 05:45

3 Answers3

127

Using equals() LocalDate does override 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;
}

If you are not happy with the result of equals(), you are good using the predefined methods of LocalDate.

Notice that all of those method are using the compareTo0() method and just check the cmp value. if you are still getting weird result (which you shouldn't), please attach an example of input and output

royB
  • 12,779
  • 15
  • 58
  • 80
  • 1
    _"will give compare the objects"_ I find this hard to understand, what do you mean by this? How is `LocalData.equals` different from `LocalDate.isEqual`? Your answer could use a bit more explanation. – Lii Mar 23 '15 at 07:14
  • @Lii you may check my updated answer. i've removed previous edit and added some more information – royB Mar 23 '15 at 07:41
  • "all of those method are using the `compareTo0()` method." That's interesting! Does that mean that `equals`, `isEqual` and `compareTo(other) == 0` are equivalent? The documentation is a bit unclear. – Lii Mar 23 '15 at 08:03
  • 3
    `equals` and `isEquals` both using `return compareTo0((LocalDate) obj) == 0;` so yes. the diff is that equals first check `instanceOf` while `isEqual` is strong typed to `ChronoLocalDate` – royB Mar 23 '15 at 08:10
  • @Lii @royB I just wanted to state that `equals()` accept an `Object` and will return false if you pass anything which is not an instance of `LocalDate`. – ItachiUchiha Mar 23 '15 at 08:20
3
LocalDate ld ....;
LocalDateTime ldtime ...;

ld.isEqual(LocalDate.from(ldtime));
Stepi
  • 31
  • 1
  • 4
    Welcome to Stack Overflow! Even though this may answer the question, there is no explanation of your code. Please update your answer to provide an explanation of what you are doing. Thanks! – Miroslav Glamuzina Apr 04 '19 at 02:41
0

I believe this snippet will also be helpful in a situation where the dates comparison spans more than two entries.

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;
}
Chau Tran
  • 4,668
  • 1
  • 21
  • 39
  • @Chan Tan: Thanks for the edit, need some little while to acclamatize with the content editor formattings.. – Chigozie D. Jun 14 '18 at 17:41
  • 1
    This code is fragile. I wouldn't recommend using it. In particular, if it happened to be running while the local date transitioned from one day to the next, the use of `toDateTimeAtCurrentTime` would be problematic. – JakeRobb Nov 02 '19 at 13:17
  • Method `toDateTimeAtCurrentTime` does not exist in `LocalDate` class. – belgoros Oct 06 '20 at 14:53