Java Collection Using Date Sorting on Same Date with AM/PM

I have Date as listed below:

17/03/2015 09:38:39 AM
17/03/2015 10:52:26 AM
10/03/2015 08:30:56 AM
02/03/2015 09:18:10 AM
02/03/2015 09:37:23 AM
02/03/2015 11:25:01 AM
02/03/2015 11:29:00 AM
02/03/2015 11:42:38 AM
02/03/2015 12:04:39 PM
02/03/2015 12:09:05 PM
02/03/2015 01:17:09 PM
02/03/2015 01:29:08 PM

I want them to sort them as per below result: (Same date one should be sort by timestamp)

17/03/2015 10:52:26 AM
17/03/2015 09:38:39 AM
10/03/2015 08:30:56 AM
02/03/2015 01:29:08 PM
02/03/2015 01:17:09 PM
02/03/2015 12:09:05 PM
02/03/2015 12:04:39 PM
02/03/2015 11:42:38 AM
02/03/2015 11:29:00 AM
02/03/2015 11:25:01 AM
02/03/2015 09:37:23 AM
02/03/2015 09:18:10 AM

I tried with the code, but not getting desired output:

Collections.sort(listOfDate, new Comparator<SR>() {
  public int compare(SR m1, SR m2) {
    try {
      return m2.getCreatedDateActual().compareTo(m1.getCreatedD ateActual());
    } catch (Exception e) {
    }
    return 0;
  }
});

Output coming is:

17/03/2015 10:52:26 AM
17/03/2015 09:38:39 AM
10/03/2015 08:30:56 AM
02/03/2015 12:09:05 PM
02/03/2015 12:04:39 PM
02/03/2015 11:42:38 AM
02/03/2015 11:29:00 AM
02/03/2015 11:25:01 AM
02/03/2015 09:37:23 AM
02/03/2015 09:18:10 AM
02/03/2015 01:29:08 PM (Getting wrong date here)
02/03/2015 01:17:09 PM (Getting wrong date here)

Here is my SR class.

private String createdDateActual;

public void setCreatedDateActual(String createdDateActual) {
    this.createdDateActual = createdDateActual;
}

public Date getCreatedDateActual() throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss a");

    return sdf.parse(createdDateActual);


}
Jon Skeet
people
quotationmark

The core problem IMO is that you don't have a collection of dates - you have a collection of strings.

I would recommend parsing those strings into a more suitable data type - I'd use LocalDateTime in either java.time or Joda Time if you possibly can. At that point (i.e. when you've got a List<LocalDateTime> or something similar), just a simple sort will do the right thing.

Note that it's not just AM/PM that will cause you issues at the moment - "12:05 AM" should come before "01:00 AM" for example. If your strings were in 24 hour format instead of using AM/PM, neither of these would cause a problem - but you'd still be better off having data in a more natural representation.

Now that you've posted the code you're using for comparisons, you'd still have the same problem if you used that code to convert the strings into LocalDateTime values - because you're using HH in the parsing code instead of hh. The HH format specifier is for 24-hour values, and is very rarely appropriate in conjunction with a (the AM/PM specifier). Instead, you should use hh which is in the range 01-12.

As a separate aside, it's very odd to have a property where the set method takes one type, but the get method returns something totally different (String and Date in your case respectively). I'd encourage you to be consistent.

people

See more on this question at Stackoverflow