我最近观察到一个奇怪现象,那就是用两个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
有两件事情我不明白:
- 为什么equals()返回false?
- 为什么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)
尽管我不知道为什么equals()返回false,您可以随时切换并使用[compareTo()](http://docs.oracle.com/javase/6/docs/api/java/util/ Date.html#compareTo%28java.util.Date%29)比较日期(我还没有看到失败的方法) – rageandqq
toString不改变格式,Date没有格式的概念,它只是一个容器毫秒数。 toString,ethos simple使用当前本地来显示此值的表示形式。 – MadProgrammer
你能否更新你的例子来包含'Date()'对象的构造? – merlin2011