2014-07-07 3 views
1

최근 두 개의 Java Date 객체를 equals()와 비교할 때 이상한 점을 발견했습니다. this.getDate() 및 other.getDate()는 응용 프로그램에서 Java Date 객체를 반환합니다.자바의 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()의 반환 값이 형식을 변경합니까?

    는 2 개의 일자가 동일한 지 어떤지를 비교합니다 :

나는 그것이 말하는 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 개체에 대한 1406498400000?

참조 : 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

은의 toString 출력

및 DATE2가있는 java.util의 목적은 java.sql.Date 날짜 1 클래스의 목적은 분명하다에서

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

이것은 아마도 이유 일 것입니다. 'this.getDate()'는 각 클래스의'toString()'메소드를보고,'other.getDate()'가'java.sql.Date'를 리턴하는 동안'java.util.Date'를 리턴합니다. – abl

+3

감사합니다 피터, 당신은 그것을 찍었어! 날짜 1은 java.sql.Timestamp 인스턴스 (및 java.util.Date 인스턴스)의 instanceof입니다. 날짜 2는 java.util.Date의 인스턴스였습니다. – user1438038

0

을 시도합니다.날짜

그래서 toString 출력이 다르며 equals() 메서드가 false를 제공합니다.

(obj instanceof Date)는 false를 반환하기 때문에.

+0

아, 아니요, java.sql.Date는 ('instanceof')'java.util.Date'의 인스턴스이고'java.sql.Date'는'java.util.Date'에서 확장됩니다. 사실 일치 한 객체가'Timestamp'의 인스턴스가 아니기 때문에'Timestamp # equals (Date)'만 실패합니다 ... – MadProgrammer

+0

응답 해 주셔서 감사합니다! – Maheedhar