compareTo的奇怪行为(GregorianCalendar c)

时间:2015-04-01 15:38:53

标签: java compareto

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

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, "$7")),
                Integer.parseInt(o1.replaceAll(p, "$6")), Integer.parseInt(o1.replaceAll(p, "$5")),
                Integer.parseInt(o1.replaceAll(p, "$8")), Integer.parseInt(o1.replaceAll(p, "$9")));
        GregorianCalendar cal2 = new GregorianCalendar(Integer.parseInt(o2.replaceAll(p, "$7")),
                Integer.parseInt(o2.replaceAll(p, "$6")), Integer.parseInt(o2.replaceAll(p, "$5")),
                Integer.parseInt(o2.replaceAll(p, "$8")), Integer.parseInt(o2.replaceAll(p, "$9")));
        return cal1.compareTo(cal2);
    }
});

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

2 个答案:

答案 0 :(得分:4)

您将“4月31日”与5月1日进行比较。 没有4月31日,所以无论如何它都会延续到5月1日。 (好吧,抛出异常会更有意义,但是嘿......这远远不是Calendar中最糟糕的API设计。)

我强烈建议使用SimpleDateFormat来解析日期/时间值的字符串表示,而不是自己动手。除了其他任何事情之外,SimpleDateFormat“知道”几个月是基于0的Java ...这是你犯下的基本错误。我怀疑,代码也会更具可读性。

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

答案 1 :(得分:0)

为什么不在日历上调用.getTime()并按日期排序?还是.getTime().getTime()并排序多头?