簡體   English   中英

如何比較/查找 XMLGregorianCalendar 日期列表

[英]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:452021-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM