Java 集合在同一日期使用日期排序与 AM/PM

use*_*722 5 java date

我有如下所列的日期:

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
Run Code Online (Sandbox Code Playgroud)

我希望他们按照以下结果对它们进行排序:(同一日期应按时间戳排序)

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
Run Code Online (Sandbox Code Playgroud)

我尝试使用代码,但没有获得所需的输出:

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;
  }
});
Run Code Online (Sandbox Code Playgroud)

输出是:

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)
Run Code Online (Sandbox Code Playgroud)

这是我的 SR 课。

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);


}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 2

IMO 的核心问题是您没有日期集合 - 您有字符串集合。

我建议将这些字符串解析为更合适的数据类型 -如果可以的话,我会LocalDateTime在Joda Timejava.timeJoda Time中使用。那时(即当您有一个List<LocalDateTime>或类似的东西时),只需简单的排序即可完成正确的操作。

请注意,目前不仅仅是 AM/PM 会导致问题 - 例如,“12:05 AM”应该出现在“01:00 AM”之前。如果您的字符串采用 24 小时格式而不是使用 AM/PM,则这些都不会导致问题 - 但您仍然最好使用更自然的表示形式的数据。

现在您已经发布了用于比较的代码,如果您使用代码将字符串转换为LocalDateTime值,您仍然会遇到同样的问题 - 因为您HH在解析代码中使用的是hh. 格式HH说明符适用于 24 小时值,很少适合与a(AM/PM 说明符)结合使用。相反,您应该使用hh01-12 范围内的值。

另外,有一个属性,其中 set 方法采用一种类型,但 get 方法返回完全不同的东西(分别在您的情况下),这是非常奇怪的。我鼓励你保持一致。StringDate