当date是String时,如何按日期对对象列表进行排序?

时间:2017-11-14 09:59:09

标签: java string list date arraylist

我有以下Java POJO,Start date是一个字符串:

POJO对象:

public class Schedule {

    private String id;

    private String startDate = "";

    //const and getters and setters
}

我想按开始日期字段对这些对象的列表进行排序:

将POJOS添加到列表中:

List<Schedule> schedules = new ArrayList<Schedule>();

Schedule s1 = new Schedule();
s1.setStartDate("2018-09-01T15:00:00+0000");

Schedule s2 = new Schedule();
s2.setStartDate("2018-09-15T15:00:00+0000");

schedules.add(s1);
schedules.add(s2);

我尝试过编写comparator,但似乎没有用,有没有办法按日期排序strings(最早的第一个)?

编辑:我目前正在使用Java 7

4 个答案:

答案 0 :(得分:2)

我认为您可以创建一个自定义比较器,其结构类似于以下结构:

Collections.sort(datestring, new Comparator<String>() {
    DateFormat df = new SimpleDateFormat("your format");
    @Override
    public int compare(String s1, String s2) {
       try {
            return df.parse(s1).compareTo(df.parse(s2));
        } catch (ParseException e) {
            throw new IllegalArgumentException(e);
        }
    }
});

答案 1 :(得分:1)

基本上,您需要将时区转换为日期作为排序操作的一部分:

schedules.sort((s1, s2) -> {
  ZonedDateTime d1 = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(s1.getStartDate(), ZonedDateTime::from);
  ZonedDateTime d2 = DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(s2.getStartDate(), ZonedDateTime::from);

  return d1.compareTo(d2);
});

答案 2 :(得分:1)

尝试java 8 Comparator可能吗?

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
schedules.sort(Comparator.comparing(s -> dateTimeFormatter.parse(s.getStartDate(), ZonedDateTime::from)));
  

Java 8 ZonedDateTime在偏移量+00:00中需要冒号。代码应该在Java 9中运行!

     

Java 8解决方法,要么使用显式格式化程序,要么自己插入冒号。 - Ole V.V。

List<Schedule> schedules = new ArrayList<>();

Schedule s1 = new Schedule();
s1.setStartDate("2018-09-01T15:00:00+00:00"); //add a colon in the offset

Schedule s2 = new Schedule();
s2.setStartDate("2018-09-15T15:00:00+00:00"); //add a colon in the offset

schedules.add(s1);
schedules.add(s2);

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
schedules.sort(Comparator.comparing(s -> dateTimeFormatter.parse(s.getStartDate(), ZonedDateTime::from)));

或者您需要自己创建一个格式化程序并在上面的lambda中使用它。

//final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("your format");

答案 3 :(得分:1)

最好的方法是将您的字符串转换为类Schedule中的日期。

private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

public class Schedule {

    private String id;

    private String startDate = "";

    private Date startDateAsDate;

    public Date getStartDateAsDate() {
        if (startDateAsDate != null) {
            return startDateAsDate;
        }
        try {
            startDateAsDate = (Date) SDF.parseObject(startDate);
            return startDateAsDate;
        } catch (Exception e) {
            return null;
        }
    }
}

private class ScheduleComparator implements Comparator<Schedule> {

    @Override
    public int compare(Schedule o1, Schedule o2) {
        // TODO Auto-generated method stub
        return o1.getStartDateAsDate().compareTo(o2.getStartDateAsDate());
    }

}

Collections.sort(scheduleList, new ScheduleComparator());
// or
Arrays.sort(scheduleArray, new ScheduleComparator());