compareTo(GregorianCalendar c) 的奇怪行为

Weird behaviour of compareTo(GregorianCalendar c)

你能告诉我为什么填充代码:

int a = new GregorianCalendar(2015,3,31,7,45).compareTo(
        new GregorianCalendar(2015,4,1,7,45);
System.out.println(a);

打印出 0?

有没有办法让它正常工作?

PS:我需要按日期对字符串进行排序,我使用了这个比较器:

array.sort(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        GregorianCalendar cal1 = new GregorianCalendar(Integer.parseInt(o1.replaceAll(p, "")),
                Integer.parseInt(o1.replaceAll(p, "")), Integer.parseInt(o1.replaceAll(p, "")),
                Integer.parseInt(o1.replaceAll(p, "")), Integer.parseInt(o1.replaceAll(p, "")));
        GregorianCalendar cal2 = new GregorianCalendar(Integer.parseInt(o2.replaceAll(p, "")),
                Integer.parseInt(o2.replaceAll(p, "")), Integer.parseInt(o2.replaceAll(p, "")),
                Integer.parseInt(o2.replaceAll(p, "")), Integer.parseInt(o2.replaceAll(p, "")));
        return cal1.compareTo(cal2);
    }
});

它使用正则表达式,但排序正确,只有提供的日期排序不正确。

您将 "April 31st" 与 5 月 1 日进行比较。 没有 4 月 31 日,因此无论如何它都会滚动到 5 月 1 日。 (好吧,抛出一个异常更有意义,但是嘿......这远不是 Calendar 中最糟糕的 API 设计。)

我强烈建议使用 SimpleDateFormat 来解析 date/time 值的字符串表示,而不是自己动手。撇开其他不谈,SimpleDateFormat "knows" 月份在 Java 中是从 0 开始的……这是您遇到的基本错误。我怀疑代码也会更具可读性。

你真的需要将集合作为字符串集合保存吗?如果它们是 只是 日期,请将其转换为某种日期类型的集合(最好使用 Joda Time 或 Java 8 的 java.time 包)。如果它们类似于具有日期和其他信息的日志条目,请先将它们转换为该日期的表示形式。无论哪种方式,您都会得到一个集合,该集合更自然地表示它所拥有的信息。

为什么不直接在日历上调用 .getTime() 并按日期排序?或 .getTime().getTime() 并对多头进行排序?