如何对对象集合上的字符串日期进行排序
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()));
【讨论】:
以上是关于如何对对象集合上的字符串日期进行排序的主要内容,如果未能解决你的问题,请参考以下文章