我有两个日历对象,它们似乎包含相同的日期,但compareTo()方法返回-1作为结果,任何人都可以解释这背后的原因。
在调试两个Calendar对象时,结果显示为:
2014-06-01T00:00:00.000Z
两个日历对象的但compareTo()返回-1。即使是两个日期的毫秒长时间也是不同的。
答案 0 :(得分:3)
好吧,看看Calendar
代码(这是来自JDK 1.7.0-13):
public int compareTo(Calendar anotherCalendar) {
return compareTo(getMillisOf(anotherCalendar));
}
private int compareTo(long t) {
long thisTime = getMillisOf(this);
return (thisTime > t) ? 1 : (thisTime == t) ? 0 : -1;
}
很明显,如果两个Calendar
具有不同的millis
,则它们与第二种方法不同。
在任何情况下,示例中的millis都不应代表2014-06-01T00:00:00.000Z
,因此代码中存在另一个问题。试试这个:
Timestamp ts1 = new Timestamp( 1401561000000L );
Timestamp ts2 = new Timestamp( 1401595200000L );
System.err.println( ts1 );
System.err.println( ts2 );
输出:
2014-05-31 20:30:00.0
2014-06-01 06:00:00.0
干杯,
答案 1 :(得分:0)
毫秒数是Java中的“官方”时间。但是,由于各种原因,有些数字具有相同的日期/时间,具有不同的毫秒数。那么正常的原因是时钟调整。例如。有时您需要添加一两秒来解释地球轨道的不规则性。另一个重要来源是当区域首次进入UTC时,某些时区会移动数小时。
这也是这些事情的共同来源:DST。 当你移动到夏令时时,这将发生在一年两次,一方面有不存在的日期/时间,因为它们被“跳过”,还有其他时间发生两次,因为时钟被重置为午夜,所以11点 - 午夜在同一天发生两次。
答案 2 :(得分:0)
如果您只想比较分钟并忽略毫秒或秒,请执行以下操作:
您需要使用
cal.set(Calendar.MILLISECOND, 0);
也可能
cal.set(Calendar.SECOND, 0);
如果你只需要分钟来匹配。
<小时/>
快速解释发生了什么:
比较时间值(与Epoch的毫秒偏移量) 由两个Calendar对象表示。
所以你承认&#34; ..两个日期的毫秒长时间不同......&#34;
Calendar.setTime采用java.util.Date,它只是一个包装器 大约一长,表示自1月午夜以来的毫秒数 1970年1月,UTC。它没有&#34;格式为MM / dd / yyy&#34; - 那是一个字符串 表示,而不是java.util.Date。如果碰巧打印出来的话 以MM / dd / yyyy的格式出现,这就是Date.toString正在做的事情 对你来说 - 它本身并不是格式的一部分。
这应该回答你关于发生了什么的问题。
注意:java.util.Date也存在同样的问题。
PS。很多人都说使用Joda Time,我听说它将使用Java 8,但我没有亲自尝试过。如果您要使用大量日期代码,我建议您使用它。
答案 3 :(得分:0)
我在Date上调用了compareTo而不是Calendar,并得到了正确的结果。可能是因为Calendar存储时区信息但Date对象没有。
由于