こんにちは私はこのようなコードスニペットを持っています:
Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));
出力は次のようになります。
Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false
このjava.sql.Timestampクラスの何が問題になっていますか?
はい、私はこれを見ました:
注:このタイプは、java.util.Dateと個別のナノ秒値の複合です。java.util.Dateコンポーネントには、整数秒のみが格納されます。分数秒(ナノ)は別です。Timestamp.equals(Object)メソッドは、日付のnanosコンポーネントが不明であるため、java.util.Date型の値が渡されたときにtrueを返すことはありません。その結果、Timestamp.equals(Object)メソッドはjava.util.Date.equals(Object)メソッドに関して対称ではありません。また、ハッシュコードメソッドは基礎となるjava.util.Date実装を使用するため、計算にnanosは含まれません。
上記のTimestampクラスとjava.util.Dateクラスの違いにより、コードはTimestamp値を一般的にjava.util.Dateのインスタンスとして表示しないことをお勧めします。Timestampとjava.util.Dateの間の継承関係は、実際には実装の継承を示しており、型の継承ではありません。
ただし、日付<->タイムスタンプの関係です。
私の例では、タイムスタンプしかありませんが、それでも動作は予期しないものです。
更新:回答
これが発生する理由は、before()
メソッドがオーバーロードされており、でオーバーライドされていないためjava.sql.Timestamp
です。私は「オーバーライド」動作を期待していました。タイムスタンプを比較する正しい方法は、日付ではなくタイムスタンプ変数を使用することです。
継承はタイムスタンプが-日付であり、ペナルティや例外がないことを意味するはずなので、これはまだJavaコアでの設計上の決定としては不十分です。