2014-07-07 61 views
1

我最近观察到一个奇怪现象,那就是用两个Java Date对象与equals()进行比较。请注意,this.getDate()和other.getDate()都会在我的应用程序中返回一个Java Date对象。Java中日期对象的比较

代码:

logger.debug("Date 1: " + this.getDate().toString()); 
logger.debug("Date 1: " + this.getDate().getTime()); 

logger.debug("Date 2: " + other.getDate().toString()); 
logger.debug("Date 2: " + other.getDate().getTime()); 

logger.debug("Dates are equal: " + this.getDate().equals(other.getDate())); 
logger.debug("Dates match in comparison: " + (this.getDate().compareTo(other.getDate()) == 0)); 

输出:(加空行以提高可读性)

Date 1: 2014-07-28 00:00:00.0 
Date 1: 1406498400000 

Date 2: Mon Jul 28 00:00:00 CEST 2014 
Date 2: 1406498400000 

Dates are equal: false 
Dates match in comparison: true 

有两件事情我不明白:

  1. 为什么equals()返回false?
  2. 为什么toString()的返回值改变其格式?

我检查的Date.equals(),它说的文档:

比较两个日期的相等。当且仅当 参数不为null并且是一个Date对象,该对象表示与此对象相同的时间点(以毫秒为单位)时,结果为true。

因此,当且仅当getTime方法 为返回相同的long值时,两个Date对象相等。

我也看了一下Date.equals()的实现:

public boolean equals(Object obj) { 
    return obj instanceof Date && getTime() == ((Date) obj).getTime(); 
} 

那么,为什么equals()回报,即使getTime()回报两个Date对象?

参考: http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#equals(java.lang.Object)

+0

尽管我不知道为什么equals()返回false,您可以随时切换并使用[compareTo()](http://docs.oracle.com/javase/6/docs/api/java/util/ Date.html#compareTo%28java.util.Date%29)比较日期(我还没有看到失败的方法) – rageandqq

+0

toString不改变格式,Date没有格式的概念,它只是一个容器毫秒数。 toString,ethos simple使用当前本地来显示此值的表示形式。 – MadProgrammer

+0

你能否更新你的例子来包含'Date()'对象的构造? – merlin2011

回答

8

我想他们不都是Date对象的格式是不同的。

java.sql.Timestamp扩展java.util.Date,但它是一个不同的类并且不相等。

从时间戳

public boolean equals(java.lang.Object ts) { 
    if (ts instanceof Timestamp) { 
    return this.equals((Timestamp)ts); 
    } else { 
    return false; 
    } 
} 

你可能会发现,如果你其他的方式对它们进行比较围绕它返回true。 :P

尝试

logger.debug("Dates are equal: " + other.getDate().equals(this.getDate())); 
+0

这可能是原因。看到每个类的'toString()'方法的文档,'this.getDate()'可能返回一个'java.util.Date',而'other.getDate()'返回'java.sql.Date' – abl

+3

谢谢彼得,你钉了它!日期1是instanceof'java.sql.Timestamp'(和instanceof'java.util.Date')。日期2是instanceof'java.util.Date'。 – user1438038

0

从输出的toString

显然,日期1是类的对象java.sql.Date 和date2是java.util中的对象。日期

所以toString输出是不同的,并且equals()方法提供了false。

因为(obj instanceof Date)将返回false。

+0

啊,不,'java.sql.Date'是(''instanceof''''util.Date''的一个实例,''java.sql.Date'''从'java.util.Date'继承而来。事实上,唯一比较失败的是'Timestamp#equals(Date)',因为匹配的对象不是'Timestamp'的实例... – MadProgrammer

+0

感谢您的回应! – Maheedhar