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()
并对多头进行排序?
你能告诉我为什么填充代码:
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()
并对多头进行排序?