Java相同的日期包含不同的时间(以毫秒为单位)

时间:2014-05-19 10:23:18

标签: java

我有两个日历对象,它们似乎包含相同的日期,但compareTo()方法返回-1作为结果,任何人都可以解释这背后的原因。

在调试两个Calendar对象时,结果显示为:

2014-06-01T00:00:00.000Z

两个日历对象的

但compareTo()返回-1。即使是两个日期的毫秒长时间也是不同的。

4 个答案:

答案 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);

如果你只需要分钟来匹配。

<小时/>

快速解释发生了什么:

JavaDoc for Calendar州:

  

比较时间值(与Epoch的毫秒偏移量)   由两个Calendar对象表示。

所以你承认&#34; ..两个日期的毫秒长时间不同......&#34;

@JonSkeetquestion中说:

  

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对象没有。

由于