比较Java中的Date对象

时间:2014-07-07 21:19:08

标签: java date equals compareto

我最近在使用equals()比较两个Java Date对象时发现了一个奇怪的现象。请注意,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));

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

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()的返回值会改变其格式?
  3. 我查看了Date.equals()的文档,其中包含:

      

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

         

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

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

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

    那么为什么equals()会返回 false ,即使getTime()Date个对象返回 1406498400000 呢?

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

2 个答案:

答案 0 :(得分: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;
  }
}

你可能会发现如果你比较它们,那么它就会返回true。 :P

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

答案 1 :(得分:0)

从toString输出

很明显,Date1是java.sql.Date类的对象 和Date2是java.util.Date

的对象

所以toString输出不同,equals()方法给出错误。

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