![](/img/trans.png)
[英]How to compare XMLGregorianCalendar with only the Date portion (day, month, year)?
[英]How to compare/find a list of XMLGregorianCalendar dates
例如:我們有一個List<XMLGregorianCalendar> dates
,我們需要在這個列表中找到最新的日期。
非常感謝您的幫助!
相當奇怪的是, XMLGregorianCalendar
有一個compareTo()
方法,但沒有實現Comparable
,這使得這變得不必要地困難。 我傾向於將您的值轉換為對 Java 更友好的東西,例如ZonedDateTime
並使用它。 I guess if you're using XMLGregorianCalendar then it's probably because you're using JAXB data binding to XML: the class was invented because at the time, none of the Java date/time options quite matched the XSD data types, but that's no longer確實如此。
正如 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 );
}
此片段中的 Output 是:
2021-03-30T13:00:00.000+01:00
我選擇了我的數據,以便列表中的第一項和最后一項表示相同的時間點,只有一個在 UTC 上,另一個在偏移量 +01:00(例如愛爾蘭夏令時)。 后者是 output 並非巧合。 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.