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

use*_*005 28 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");
Run Code Online (Sandbox Code Playgroud)

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

for (String s : datestring)
{
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

.

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

Evg*_*eev 76

试试这个

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

或者使用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)));
Run Code Online (Sandbox Code Playgroud)


小智 8

可以使用下面给出的 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);
                }
            });
Run Code Online (Sandbox Code Playgroud)

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


Con*_*der 5

一种选择是将日期添加到 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());
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 5

java.time

首先,正如鲍莫尔已经说过的,你不应该在列表中保留字符串。相反,使用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));
Run Code Online (Sandbox Code Playgroud)

现在排序很简单:

dateTimeList.sort(Comparator.naturalOrder());
Run Code Online (Sandbox Code Playgroud)

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

dateTimeList.sort(LocalDateTime::compareTo);
Run Code Online (Sandbox Code Playgroud)

当然,为了向用户呈现排序后的数据,我们希望将日期时间格式化为字符串:

dateTimeList.forEach(ldt -> System.out.println(ldt.format(formatter)));
Run Code Online (Sandbox Code Playgroud)

输出是:

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

除了分号和一个简单的拼写错误之外,我相信这正是您所要求的。

链接: Oracle 教程:日期时间解释如何使用java.time,现代 Java 日期和时间 API,包括LocalDateTimeDateTimeFormatter