버그가 있은 후 밀리 초가 걸리는 생성자를 사용하여 java.util.Date에서 java.sql.Timestamp를 생성하면 Date 인스턴스가 항상 타임 스탬프 (after)임을 알 수있었습니다. (a) before()에 대한 계약이 엄격한 비교를 지정하고 (b) 같지 않은 경우 Timestamp는 나노초를 가졌기 때문에 날짜 자체 이후 일 수 있습니다. 그러나 결과는 반대이고 반복 가능합니다 (JDK 1.6 및 1.7, JVM 시간대가 다름). 두 날짜를 비교하면 올바르게 작동하지만 Date에서 before() 또는 after()를 호출하고 Timestamp 인수를 지정하면 예기치 않은 결과가 발생합니다.java.util.Date에서 생성 된 java.sql.Timestamp는 항상 before()입니까?
아래 샘플 코드는 두 개의 Date와 Timestamp 인스턴스를 가지며, 모두 밀리 초 값이 같습니다. 그러나 Date와 Timestamp를 비교하면 Date가 after() 인 시간이 표시됩니다.
import java.util.Date;
import java.sql.Timestamp;
public class X extends Date {
public static void main(String[] args) {
Date d1 = new Date();
Date d2 = new Date(d1.getTime());
Timestamp t = new Timestamp (d1.getTime());
System.out.println ("date1 = " + d1 + " (" + d1.getTime() + ")");
System.out.println ("date2 = " + d2 + " (" + d2.getTime() + ")");
System.out.println ("timestamp = " + t + " (" + t.getTime() + ")");
System.out.println ("d1 before d2: " + d1.before(d2));
System.out.println ("d1 after d2: " + d1.after(d2));
System.out.println ("d1 before ts: " + d1.before(t));
System.out.println ("d1 after ts: " + d1.after(t)); //why true?
}
}
샘플 출력 :
C:\>\Java\jdk1.7.0_05\bin\java X
date1 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
date2 = Tue Oct 30 10:15:59 EDT 2012 (1351606559812)
timestamp = 2012-10-30 10:15:59.812 (1351606559812)
d1 before d2: false
d1 after d2: false
d1 before ts: false
d1 after ts: true
마지막 줄 호기심이다.
감사합니다. 당신이 내부 표현을보고 무엇을 after()
방법으로 비교하는 경우
디버거를 사용하여이를 가리 킵니다. [Timestamp API] (http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html) * "[...]를 사용하면 타임 스탬프 값을 볼 수없는 코드를 권장합니다. 일반적으로 java.util.Date의 인스턴스로 사용됩니다. "* – Kai
'd1.compareTo (ts);는 결과가 1이고, 1 나노 차이 또는 그와 비슷한 것이 있음을 나타냅니다. ___ 나는 그것이 버그라고 믿습니다. 그렇습니다. 그것을 찾는 멋진 직업! – XenoRo