バグに続いて、ミリ秒かかるコンストラクターを使用して java.util.Date から java.sql.Timestamp を作成すると、Date インスタンスは常に Timestamp の after() になることに気付きました。(a) before() のコントラクトは厳密な比較を指定し、(b) 等しくない場合、タイムスタンプはナノ秒であるため、それ自体が after() 日付である可能性があるため、これは不可解です。しかし、結果は逆で、再現可能です (JDK 1.6 と 1.7 では、JVM タイムゾーンが異なります)。2 つの Date の比較は正しく機能しますが、Date で before() または after() を呼び出して Timestamp 引数を指定すると、予期しない結果が生じます。
以下のサンプル コードには、2 つの Date インスタンスと 1 つの Timestamp インスタンスがあり、すべて同じミリ秒値です。しかし、日付とタイムスタンプを比較すると、日付がタイムスタンプの 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
最後の行は興味深いものです。
ありがとうございました。