排序日期和时间值

时间:2016-09-26 09:58:15

标签: java sorting date time timestamp

简单地说,我有一个不同日期和时间的字符串数组。每个元素都是这种格式:

  

2015-08-27T22:24:31.903

即,YYYY-MM-DD T HH:MM:SS.MMM

我正在整理它们。是否有可用于对此格式进行排序的默认方法?

我现在正在做的是将字符串拆分为 T ,将日期和时间转换为相应的时间戳,添加它们然后对时间戳值进行排序。是否有可用于此格式的直接解析器?最受欢迎的是更好的解决方案。

5 个答案:

答案 0 :(得分:4)

  

我有一个字符串数组。每个元素都采用以下格式:2015-08-27T22:24:31.903。是否有可用于对此格式进行排序的默认方法?

是。由于ISO字符串的日期字段按数量级的降序排列,并且字段是固定宽度的,因此您可以使用Arrays.sort(Object[] a)直接对字符串进行简单排序:按指令对指定的对象数组进行排序。其元素的自然排序。

  

是否有针对此格式的直接解析器?

是。 LocalDateTime.parse(CharSequence text)LocalDateTime等文本字符串中获取2007-12-03T10:15:30的实例。

答案 1 :(得分:3)

我认为那些是字符串。如果您不想做明显的事情(将它们转换为java.util.Datejava.time.Instant并比较结果),您可以将它们作为字符串进行比较,即特定日期时间格式(几乎完整)当您使用字符串比较时,ISO-8601时间戳,只是缺少时区指示符)。

无偿示例(live copy):

import java.util.*;

class Example
{
    public static void main (String[] args)
    {
        String[] strings = {
            "2002-10-24T13:51:25.417",
            "2001-03-25T23:41:24.234",
            "2008-10-05T04:41:56.004",
            "2013-04-10T22:14:06.852",
            "2005-08-24T05:05:01.080",
            "2015-11-20T17:32:27.303",
            "2003-07-16T06:32:07.703",
            "2005-03-20T08:28:18.440",
            "2009-04-17T13:20:09.499",
            "2002-11-04T06:39:55.287"
        };
        Arrays.sort(strings);
        for (String s : strings) {
            System.out.println(s);
        }
    }
}

输出:

2001-03-25T23:41:24.234
2002-10-24T13:51:25.417
2002-11-04T06:39:55.287
2003-07-16T06:32:07.703
2005-03-20T08:28:18.440
2005-08-24T05:05:01.080
2008-10-05T04:41:56.004
2009-04-17T13:20:09.499
2013-04-10T22:14:06.852
2015-11-20T17:32:27.303

如果您需要不同的订购(例如逆序),您当然可以提供Comparator

答案 2 :(得分:2)

使用现代Java

Answer by Andreas是正确的。这是使用添加到更高版本的Java中的较新功能的变体。

使用List.of输入一些示例数据。结果列表不可修改。因此,将不可修改列表提供给ArrayList的构造函数,以获取可排序的可修改列表。

List < String > strings = new ArrayList <>(
        List.of(
                "2015-08-27T22:24:31.903" ,
                "2018-08-27T22:24:31.903" ,
                "2016-08-27T22:24:31.903" ,
                "2017-08-27T22:24:31.903"
        )
);

按文本排序

如该其他答案所述,您的字符串为标准ISO 8601格式。当按字母顺序排序时,该特定格式被设计为按时间顺序排列。因此,如果此任务是此数据的唯一目标,则无需将其解析为日期时间对象。就像文本一样,作为String对象。

Collections接口使用了List方法,而不是使用sort实用工具类。该方法需要Comparator。除了实现该接口,我们可以调用Comparator.naturalOrder()来生成实例。

strings.sort( Comparator.naturalOrder() );

转储到控制台。

System.out.println( "strings = " + strings );

请参阅此code run live at IdeOne.com

字符串= [2015-08-27T22:24:31.903,2016-08-27T22:24:31.903,2017-08-27T22:24:31.903,2018-08-27T22:24:31.903]

排序为日期时间对象

如果您将进一步处理此输入,则将其解析为日期时间对象。

现代方法使用 java.time 类。

我们可以简化示例数据,因为我们可以直接处理List产生的不可修改的List.of

List < String > strings =
        List.of(
                "2015-08-27T22:24:31.903" ,
                "2018-08-27T22:24:31.903" ,
                "2016-08-27T22:24:31.903" ,
                "2017-08-27T22:24:31.903"
        );

制作LocalDateTime个对象中的空List

List < LocalDateTime > ldts = new ArrayList <>( strings.size() );

通过一次解析我们的输入字符串并生成一个LocalDateTime对象来填充该列表。将该对象添加到我们的列表中。

请注意, java.time 类默认情况下使用ISO 8601格式。因此,无需指定格式设置模式。

for ( String string : strings )
{
    ldts.add( LocalDateTime.parse( string ) );  // Parsing text in ISO 8601 format needs no formatting pattern to be specified.
}

排序,如上所述。呼叫List::sort,并传递Comparator

ldts.sort( Comparator.naturalOrder() ) ;

看到那个code run live at IdeOne.com

System.out.println( "ldts = " + ldts );

如果想花哨的话,可以用for代替Stream循环。我们可以单线完成这项工作。

List < String > strings =
        List.of(
                "2015-08-27T22:24:31.903" ,
                "2018-08-27T22:24:31.903" ,
                "2016-08-27T22:24:31.903" ,
                "2017-08-27T22:24:31.903"
        );

List < LocalDateTime > ldts = 
    strings
    .stream()
    .map( s -> LocalDateTime.parse( s ) )
    .sorted()
    .collect( Collectors.toList() )
;

System.out.println( "ldts = " + ldts );

ldts = [2015-08-27T22:24:31.903,2016-08-27T22:24:31.903,2017-08-27T22:24:31.903,2018-08-27T22:24:31.903]

答案 3 :(得分:1)

1)使用适当的SimpleDateFormat:

解析字符串
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss.SSS");
try {
    Date date = formatter.parse(dateInString);
} catch (ParseException e) {
    e.printStackTrace();
}

2)将每个日期存储在列表中。为此,首先要实例化一个新列表...

ArrayList<Date> myDates = new ArrayList<Date>();

...在parse命令之后将每个日期添加到列表中:

myDates.add(date);

3)使用以下方式对它们进行排序:

Collections.sort(myDates); // Ascending

Collections.sort(myDates, Collections.reverseOrder()); // Descending

答案 4 :(得分:0)

使用Calendar API对日期和时间进行排序

import java.util.ArrayList;
import java.util.Collections;

public class SortMain {

    public static void main(String[] args) {

        ArrayList<SomeObj> al= new ArrayList();

        SomeObj s1 = new SomeObj("9", "2020-02-05");
        al.add(s1);
        s1 = new SomeObj("7", "2020-02-05");
        al.add(s1);
        /*s1 = new SomeObj("15", "2019-12-25");
        al.add(s1);
        s1 = new SomeObj("6", "2019-12-25");
        al.add(s1);*/

        printArrayList(al);

        Collections.sort(al);

        System.out.println("*************");

        printArrayList(al);

    }

    private static void printArrayList(ArrayList<SomeObj> al) {
        for(SomeObj someObj: al) {
            System.out.println(someObj.getDate() + " ** " + someObj.getTime());
        }
    }
}

然后

package com.karthik.sorting;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class SomeObj implements Comparable<SomeObj>{

    private String time;
    private String date;

    public SomeObj(String time, String date) {
        super();
        this.time = time;
        this.date = date;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }

     @Override
     public int compareTo(SomeObj siteHealthGraphItem) {
         String receivedPattern = "yyyy-MM-dd";
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat(receivedPattern);
         try {
             Date date1 = simpleDateFormat.parse(getDate().toString());
             Date date2 = simpleDateFormat.parse(siteHealthGraphItem.getDate().toString());

             if (getTime() == null) {
                 return date1.compareTo(date2);
             } else if (getTime() != null) {

                 Calendar cal1 = Calendar.getInstance();
                 cal1.setTime(date1);
                 cal1.set(Calendar.HOUR_OF_DAY, Integer.parseInt(getTime()));

                 Calendar cal2 = Calendar.getInstance();
                 cal2.setTime(date2);
                 cal2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(siteHealthGraphItem.getTime()));

                 return cal1.compareTo(cal2);
             }
         } catch (Exception e) {
             System.out.println("Data is improper - Sorting Did not work..!");
             e.printStackTrace();
         }
         System.out.println("Sorting Did not work..!");
         return 0;
     }


}