0

例如:我们List<XMLGregorianCalendar> dates需要在此列表中查找最新日期。

非常感谢您的帮助!

4

2 回答 2

2

奇怪的是,XMLGregorianCalendar有一个compareTo()方法但没有实现Comparable,这使得这变得不必要地困难。我倾向于将您的值转换为对 Java 更友好的东西,例如 aZonedDateTime并使用它。我猜如果您使用 XMLGregorianCalendar,那可能是因为您使用 JAXB 数据绑定到 XML:该类是发明的,因为当时没有一个 Java 日期/时间选项与 XSD 数据类型完全匹配,但这不再是确实如此。

于 2021-03-30T23:08:41.923 回答
0

正如 Michael Kay 在评论中所说,实际上列表中的日期时间通常都有时间或没有时间,并且都具有 UTC 偏移量(XML 用语中的“时区”)或没有。这是您的请求有意义的要求。哪个23:34:452021-03-31之后?XMLGregorianCalendar足够灵活以适应两者。

如果您的XMLGregorianCalendar对象都有完整的日期、时间和偏移量,我建议将它们排序为OffsetDateTimes:

    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,因此选择了此选项。

有更多的方法可以从 转换XMLGregorianCalendarOffsetDateTime. 我选择解析为字符串,因为它让我们验证了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请以相同的方式使用。

于 2021-03-31T15:26:51.700 回答