簡體   English   中英

比較Java中的Date對象

[英]Comparing of Date objects in Java

我最近觀察到一個奇怪的事情,比較兩個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));

輸出:(添加空行以提高可讀性)

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對象時,結果才為真,該對象表示與此對象相同的時間點,以毫秒為單位。

因此,當且僅當getTime方法為兩者返回相同的long值時,兩個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)

我猜他們不是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()));

從toString輸出

很明顯,Date1是類java.sql.Date的對象,Date2是java.util.Date的對象

所以toString輸出是不同的,equals()方法給出false。

因為(obj instanceof Date)將返回false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM