比较Java中的Date对象

use*_*038 2 java date equals compareto

我最近观察到一个奇怪的事情,比较两个Java Date对象与equals().请注意,this.getDate()和other.getDate()都将在我的应用程序中返回Java Date对象.

码:

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));
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我有两件事没有得到:

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

我检查了Date.equals()的文档,其中说:

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

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

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

public boolean equals(Object obj) {
    return obj instanceof Date && getTime() == ((Date) obj).getTime();
}
Run Code Online (Sandbox Code Playgroud)

那么为什么equals()返回false,即使两个对象都getTime()返回1406498400000Date

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

Pet*_*rey 9

我猜他们不是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;
  }
}
Run Code Online (Sandbox Code Playgroud)

您可能会发现,如果您比较它们,则反过来会返回true.:P

尝试

logger.debug("Dates are equal: " + other.getDate().equals(this.getDate()));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢彼得,你钉了它!日期1是`java.sql.Timestamp`(和instanceof`java.util.Date`)的实例.日期2是`java.util.Date`的实例. (3认同)