java.sql.TimestampからgetTimeすると、もとの精度にはもどせないことに注意せよ。 2014/03/26

javaです。いろいろごめんなさいな感じです。
以前、
というメモを残したのですが、ちとこれあぶないです。

まずい点が2つあります。
まずひとつめ、SimpleDateFormatを使わなくてもよい。
javadocをみますと



valueOf
があるのでわざわざ SimpleDateFormatをもちだす必要はないです。
素直にTimestamp.valueOfを使えばよかった。

まずい点ふたつめ、ひとつめと絡んでいるのですが、実は、TimestampのgetTimeはミリセコンドまでの変換します。
逆をいいますとgetTimeはミリ秒までの精度でしか変換してくれません。

Timestampがミリ秒より高い精度の値をもっている場合、getTimeを使うとの精度は表現されないということになります。

実際、Timestamp.valueOfに"2014-03-26 23:58:56.123456789"という値を渡して変換できます。そして、Timestamp.valueOfに"2014-03-26 23:58:56.123"という値を変換してgetTimeをした場合、精度が高いタイムスタンプと同じ値になります。

 コード

Timestamp t1 = Timestamp.valueOf("2014-03-26 23:58:56.123"); Timestamp t2 = Timestamp.valueOf("2014-03-26 23:58:56.123456789"); System.out.println(t1); System.out.println(t2); System.out.println(t1.getTime()); System.out.println(t2.getTime()); boolean b1 = t1.equals(t2); boolean b2 = t1.getTime() == t2.getTime(); System.out.println("オブジェクトの比較結果 " + b1); System.out.println("getTimeした値での比較結果 " + b2);

結果
2014-03-26 23:58:56.123
2014-03-26 23:58:56.123456789
1395845936123
1395845936123
オブジェクトの比較結果 false
getTimeした値での比較結果 true

DB(種類?性能?)によっては組み込みのCURRENT TIMESTAMPでタイムスタンプを生成した場合、精度がより高い値でつくる場合があるようです。

ですので、前回書いた記事の方式を採用すると、精度の低いgetTime同士の比較はOKですが、タイムスタンプ同士の比較ができなくなってしまいます。

いろいろ残念でしたが、いい勉強となりました。反省。

: