如何在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
。 将比较器的实现传递给日期,例如
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()); }