11

こんにちは私はこのようなコードスニペットを持っています:

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コアでの設計上の決定としては不十分です。

4

4 に答える 4

3

まあ、それは十分に文書化されていない機能のようです。

beforeおよびのafterメソッドはTimestamp秒まで比較しているようですが、ミリ秒の部分は考慮されていません。TimeStamp両方が明確な秒数になり、比較が期待どおりに機能するまで実行してみてください(スリープを500に増やして簡単にします)。

ちなみに、このcompareToメソッドはミリ秒を考慮しているので、代わりにそれを使用できます。

于 2013-03-26T04:16:46.437 に答える
3

Timestampの代わりに使用してみてください。それでDateうまくいきます。

Timestamp d1 = new java.sql.Timestamp(new Date().getTime());

TimestampDateどちらもメソッドの独自の実装を持っていますbefore。確認してください。

于 2013-03-26T04:28:12.543 に答える
1

メソッドを呼び出すとTimestamp.before(Timestamp)、期待どおりの結果が得られます。

しかし、どうやらaをaTimestampとして使用するとDate、混乱することになります。静的にTimestamp使用する必要があります。Timestamp

于 2013-03-26T04:34:29.083 に答える
0

ここで述べたように

タイムスタンプは薄いラッパーです

タイムスタンプは、SQL TIMESTAMPの小数秒の値を保持する機能を追加するだけです(問題が発生している場合はナノ秒の精度で)

于 2013-03-26T05:47:09.453 に答える