如何在java中对字符串格式的日期进行排序?

我有一个字符串值的arraylist

 ArrayList datestring=new ArrayList(); datestring.add("01/21/2013 @03:13 PM"); datestring.add("01/21/2013 @04:37 PM"); datestring.add("01/21/2013 @10:41 AM"); datestring.add("01/21/2013 @10:48 AM"); datestring.add("01/22/2013 @06:16 AM"); datestring.add("01/22/2013 @06:19 AM"); datestring.add("01/21/2013 @05:19 PM"); datestring.add("01/21/2013 @05:19 PM"); 

任何人都可以帮我整理上面的清单吗? 以便根据AM和PM格式对值进行排序。
排序后的预期输出应该是

 for (String s : datestring) { System.out.println(s); } 

 01/21/2013 @10:41 AM; 01/21/2013 @10:48 AM; 01/21/2013 @03:13 PM; 01/21/2013 @04:37 PM; 01/21/2013 @05:16 PM; 01/21/2013 @05:19 PM; 01/22/2013 @06:16 AM; 01/22/2013 @06:19 AM; 

尝试这个

  Collections.sort(datestring, new Comparator() { DateFormat f = new SimpleDateFormat("MM/dd/yyyy '@'hh:mm a"); @Override public int compare(String o1, String o2) { try { return f.parse(o1).compareTo(f.parse(o2)); } catch (ParseException e) { throw new IllegalArgumentException(e); } } }); 

或者使用Java 8

  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy '@'hh:mm a"); Collections.sort(datestring, (s1, s2) -> LocalDateTime.parse(s1, formatter). compareTo(LocalDateTime.parse(s2, formatter))); 

虽然有一种技术方法可以解决您的问题,但最基本的错误是将Date s表示为String s,这是一种“原始的痴迷”。 如果您有文本输入,请将其转换为java.util.Date或适当的joda类( LocalDateTime似乎适合此处)。 这些类实现了Comparable开箱即用,并且对它们进行排序很容易。 但是它们还具有在操纵日期/时间实例时可能需要的所有其他逻辑,而字符串则没有。

可以使用compareTo比较字符串格式的日期列表,如下所示。

 ArrayList datestring=new ArrayList(); datestring.add("01/21/2013 @03:13 PM"); datestring.add("01/21/2013 @04:37 PM"); datestring.add("01/21/2013 @10:41 AM"); datestring.add("01/21/2013 @10:48 AM"); datestring.add("01/22/2013 @06:16 AM"); datestring.add("01/22/2013 @06:19 AM"); datestring.add("01/21/2013 @05:19 PM"); datestring.add("01/21/2013 @05:19 PM"); Collections.sort(datestring, new Comparator() { @Override public int compare(String object1, String object2) { return object1.compareTo(object2); } }); 

通过使用它你甚至不必解析字符串到日期

默认情况下,ArrayList不支持排序。 您可以使用

java.util.Collections类中的public static void sort(List list, Comparator c) 。 将比较器的实现传递给日期,例如

http://www.coderanch.com/t/392338/java/java/compare-Dates-String-Format

您可以根据需要编写自定义比较器来比较日期字符串和顺序。 然后,您将能够使用实现的比较器对集合进行排序。

一种选择是将日期添加到TreeMap,将未格式化的日期作为键,将格式化的日期作为值。 使用TreeMap将自动对值进行排序。

 private ArrayList sortDates(ArrayList dates) throws ParseException { SimpleDateFormat f = new SimpleDateFormat("dd MMM yyyy"); Map  dateFormatMap = new TreeMap<>(); for (String date: dates) dateFormatMap.put(f.parse(date), date); return new ArrayList<>(dateFormatMap.values()); }