例如:我们List<XMLGregorianCalendar> dates
需要在此列表中查找最新日期。
非常感谢您的帮助!
例如:我们List<XMLGregorianCalendar> dates
需要在此列表中查找最新日期。
非常感谢您的帮助!
奇怪的是,XMLGregorianCalendar
有一个compareTo()
方法但没有实现Comparable
,这使得这变得不必要地困难。我倾向于将您的值转换为对 Java 更友好的东西,例如 aZonedDateTime
并使用它。我猜如果您使用 XMLGregorianCalendar,那可能是因为您使用 JAXB 数据绑定到 XML:该类是发明的,因为当时没有一个 Java 日期/时间选项与 XSD 数据类型完全匹配,但这不再是确实如此。
正如 Michael Kay 在评论中所说,实际上列表中的日期时间通常都有时间或没有时间,并且都具有 UTC 偏移量(XML 用语中的“时区”)或没有。这是您的请求有意义的要求。哪个23:34:45
和2021-03-31
之后?XMLGregorianCalendar
足够灵活以适应两者。
如果您的XMLGregorianCalendar
对象都有完整的日期、时间和偏移量,我建议将它们排序为OffsetDateTime
s:
DatatypeFactory factory = DatatypeFactory.newInstance();
List<XMLGregorianCalendar> dates = Arrays.asList(
factory.newXMLGregorianCalendar(
2021, DatatypeConstants.MARCH, 30, 12, 0, 0, 0, 0),
factory.newXMLGregorianCalendar(
2021, DatatypeConstants.MARCH, 30, 9, 0, 0, 0, 60),
factory.newXMLGregorianCalendar(
2021, DatatypeConstants.MARCH, 30, 13, 0, 0, 0, 60));
if (dates.isEmpty()) {
System.out.println("No dates");
} else {
XMLGregorianCalendar maxDate
= Collections.max(dates,
Comparator.comparing(xgc -> OffsetDateTime.parse(xgc.toString())));
System.out.println(maxDate );
}
此片段的输出是:
2021-03-30T13:00:00.000+01:00
我选择了我的数据,以便列表中的第一项和最后一项表示相同的时间点,只有一个在 UTC 上,另一个在偏移量 +01:00(例如爱尔兰夏令时)。后者是输出并非巧合。OffsetDateTime.compareTo()
首先按时间点排序(在 java.time 用语中为即时),然后按本地日期时间排序,并且由于 13 听起来晚于 12,因此选择了此选项。
有更多的方法可以从 转换XMLGregorianCalendar
为OffsetDateTime
. 我选择解析为字符串,因为它让我们验证了XMLGregorianCalendar
所有的日期、时间和偏移量。
如果要按字面意思理解日期,则您的对象仅表示日期,而不是使用LocalDate
. 代码几乎相同:
List<XMLGregorianCalendar> dates = Arrays.asList(
factory.newXMLGregorianCalendarDate(2021, DatatypeConstants.MARCH, 26,
DatatypeConstants.FIELD_UNDEFINED),
factory.newXMLGregorianCalendarDate(2021, DatatypeConstants.MARCH, 29,
DatatypeConstants.FIELD_UNDEFINED),
factory.newXMLGregorianCalendarDate(2021, DatatypeConstants.MARCH, 28,
DatatypeConstants.FIELD_UNDEFINED));
if (dates.isEmpty()) {
System.out.println("No dates");
} else {
XMLGregorianCalendar maxDate
= Collections.max(dates,
Comparator.comparing(xgc -> LocalDate.parse(xgc.toString())));
System.out.println(maxDate );
}
2021-03-29
如果您有日期和时间但没有偏移量,LocalDateTime
请以相同的方式使用。