如何对对象集合上的字符串日期进行排序

Posted

技术标签:

【中文标题】如何对对象集合上的字符串日期进行排序【英文标题】:how to sort on a string date on a collection of objects 【发布时间】:2022-01-12 00:29:03 【问题描述】:

所以我很难记住语法。我有一个我试图根据日期值排序的对象列表。对象看起来像这样。

Public class someobject
    private String author;
    private String createDate;
    private String subject;
    private String body;
    private String claimNumber;
    private String authoringDate;

我正在尝试对 createDate 值进行排序。类似的东西

List<someObject> someObjectList = new ArrayList<>();

someObjectList.sort()

当前字符串到达​​ createDate 对象的方式是 YYYY/MM/DD。

【问题讨论】:

如果你把它当作字符串来处理,它不会起作用吗? 2011/12/31 将早于 2012/12/31。 someObjectList.sort(Comparator.comparing(someobject::getCreateDate)); @MuhammadGulfam 目前它是一个字符串,这是遗留代码,但我需要根据该日期对该列表进行排序。我确定有一个流,我可以将其转换为日期时间,然后根据它进行排序。 最好的解决方案是将该值存储为 LocalDate 而不是字符串。 【参考方案1】:

YYYY/MM/DD 格式的日期可以正确排序为字符串,即按字典顺序,所以:

someObjectList.sort(Comparator.comparing(someobject::getCreateDate));

或者,如果您没有 createDate 的 getter 方法:

someObjectList.sort(Comparator.comparing(o -> o.createDate));

【讨论】:

【参考方案2】:

为了获得正确的比较结果,您必须将“creationDate”字段中的字符串值转换为日期或本地日期,而不是像这样制作比较器:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY/MM/DD");
someObjectList.sort(Comparator.comparingLong(ob -> formatter.parse(ob.createDate).get(ChronoField.EPOCH_DAY)));

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY/MM/DD");
someObjectList.sort(Comparator.comparingLong(ob -> LocalDate.parse(ob.createDate, formatter).atStartOfDay(ZoneId.systemDefault()).toEpochSecond()));

【讨论】:

以上是关于如何对对象集合上的字符串日期进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何以字符串格式按日期对对象列表进行排序?

如何对List集合中的对象进行排序?

如何在 MongoDB 中按日期对集合进行排序?

java中list排序

如何根据日期对“MMM YYYY”日期字符串进行排序? [复制]

java使用stream对日期排序