【问题标题】:How to sort Date which is in string format in java?如何在java中对字符串格式的日期进行排序?
【发布时间】:2013-01-05 07:04:45
【问题描述】:

我有一个 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;

【问题讨论】:

  • 好问题!

标签: java sorting datetime


【解决方案1】:

试试这个

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

【讨论】:

  • 我的字符串中没有时间。格式为 yyyy-MM-dd。当我尝试使用上述方法进行排序时,列表保持不变。请帮忙。
  • 我不知道为什么,但它不适用于“dd-MM-yyyy”。所以我需要把它改成“MM-dd-yyyy”才能让它工作。
【解决方案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);
                }
            });

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

【讨论】:

  • @TamimAttafi ,请说明它不起作用的情况?我去看看。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    java.time

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

    保留LocalDateTime 对象。或ZonedDateTime,如果您知道时间在哪个时区。字符串有利于向用户展示,而不是用于在您的程序中进行操作,例如排序。

    以下代码将您的列表转换为List&lt;LocalDateTime&gt;

        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

    【讨论】:

      【解决方案5】:

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

      更新

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

      【讨论】:

      • @OleV.V.你会明白这个答案是在 Java 8 发布之前编写的。
      • @OleV.V.我已经编辑了我的答案,以便将来仍然有用。
      【解决方案6】:

      ArrayList 默认不支持排序。你可以使用

      public static &lt;T&gt; void sort(List&lt;T&gt; list, Comparator&lt;? super T&gt; c) 来自 java.util.Collections 类。将比较器的实现传递给对日期进行排序,例如

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-27
          相关资源
          最近更新 更多