我有以下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
答案 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());