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

时间:2013-01-22 05:13:51

标签: java sorting datetime

我有arraylist字符串值,如

ArrayList<String> datestring=new ArrayList<String>();
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;

7 个答案:

答案 0 :(得分:70)

试试这个

    Collections.sort(datestring, new Comparator<String>() {
        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)));

答案 1 :(得分:3)

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

<强> 更新

从java 8开始,我很高兴建议使用它的LocalDateTime类。

答案 2 :(得分:3)

java.time

首先,作为Bowmore has already said,您不应该在列表中保留字符串。而是使用 java.time 类的实例。

保留LocalDateTime个对象。或ZonedDateTime(如果您知道时间在哪个时区)。字符串很适合呈现给用户,而不适合排序等程序中的操作。

以下代码将您的列表转换为List<LocalDateTime>

    DateTimeFormatter formatter 
            = DateTimeFormatter.ofPattern("MM/dd/uuuu '@'hh:mm a", Locale.ENGLISH);

    List<LocalDateTime> dateTimeList = datestring.stream()
            .map(ds -> LocalDateTime.parse(ds, formatter))
            .collect(Collectors.toCollection(ArrayList::new));

现在排序很简单:

dateTimeList.sort(Comparator.naturalOrder());

LocalDateTime具有自然顺序,因为它们实现了Comparable,因此Comparator.naturalOrder()适合排序。获得相同排序的另一种方法是:

dateTimeList.sort(LocalDateTime::compareTo);

要向用户显示已排序的数据,我们希望将日期时间格式化为字符串,

dateTimeList.forEach(ldt -> System.out.println(ldt.format(formatter)));

输出为:

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:19 PM
01/21/2013 @05:19 PM
01/22/2013 @06:16 AM
01/22/2013 @06:19 AM

除了分号和一个简单的错字,我相信这正是您所要求的。

链接: Oracle tutorial: Date Time解释了如何使用java.time,这是现代Java日期和时间API,其中包括LocalDateTimeDateTimeFormatter

答案 3 :(得分:2)

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

ArrayList<String> datestring=new ArrayList<String>();
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<String>() {
                @Override
                public int compare(String object1, String object2) {
                    return object1.compareTo(object2);
                }
            });

通过使用它,您甚至不必将字符串解析为日期

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

来自public static <T> void sort(List<T> list, Comparator<? super T> c)课程的

java.util.Collections。通过你的比较器实现来排序日期,比如

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

答案 6 :(得分:-1)

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