你能告诉我为什么填充代码:
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);
}
});
它使用正则表达式,但它已正确排序,只有提供的日期没有正确排序。
答案 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()
并排序多头?