微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何比较/查找 XMLGregorianCalendar 日期列表

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

非常感谢您的帮助!

解决方法

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

,

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

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

    DatatypeFactory factory = DatatypeFactory.newInstance();
    List<XMLGregorianCalendar> dates = Arrays.asList(
            factory.newXMLGregorianCalendar(
                    2021,DatatypeConstants.MARCH,30,12,0),factory.newXMLGregorianCalendar(
                    2021,9,60),13,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 中的 Instant),其次按本地日期时间排序,由于 13 个发音晚于 12 个,因此选择此选项。

有更多方法可以将 XMLGregorianCalendar 转换为 OffsetDateTime。我选择解析为字符串是因为它可以让我们验证 XMLGregorianCalendar 具有所有日期、时间和偏移量。

如果从字面上理解 date,则您的对象仅表示日期,而使用 LocalDate。代码几乎相同:

    List<XMLGregorianCalendar> dates = Arrays.asList(
            factory.newXMLGregorianCalendarDate(2021,26,DatatypeConstants.FIELD_UNDEFINED),factory.newXMLGregorianCalendarDate(2021,29,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。