繁体   English   中英

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

[英]How to sort Date which is in string format in java?

我有一个带有字符串值的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;

尝试这个

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

可以使用下面给出的 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);
                }
            });

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

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

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

现在排序很简单:

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 教程:Date Time解释如何使用java.time ,现代 Java 日期和时间 API,包括LocalDateTimeDateTimeFormatter

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

更新

从 java 8 开始,我强烈推荐使用它的LocalDateTime类。

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

在您的班级中添加此内容。

protected LocalDateTime getTrnDateLocalFormat() {

        LocalDateTime localDateTime = LocalDateTime.parse(this.yourDate.toLowerCase(), DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm:ss a"));
        return localDateTime;
    }

.sorted(Comparator.comparing(YourClass::getTrnDateLocalFormat)).collect(Collectors.toList());

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM