java.sql.TimestampからgetTimeすると、もとの精度にはもどせないことに注意せよ。
2014/03/26
java
timestamp
javaです。いろいろごめんなさいな感じです。
以前、
というメモを残したのですが、ちとこれあぶないです。
まずい点が2つあります。
まずひとつめ、SimpleDateFormatを使わなくてもよい。
javadocをみますと
素直に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をした場合、精度が高いタイムスタンプと同じ値になります。
コード
結果
DB(種類?性能?)によっては組み込みのCURRENT TIMESTAMPでタイムスタンプを生成した場合、精度がより高い値でつくる場合があるようです。
ですので、前回書いた記事の方式を採用すると、精度の低いgetTime同士の比較はOKですが、タイムスタンプ同士の比較ができなくなってしまいます。
いろいろ残念でしたが、いい勉強となりました。反省。
以前、
というメモを残したのですが、ちとこれあぶないです。
まずい点が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ですが、タイムスタンプ同士の比較ができなくなってしまいます。
いろいろ残念でしたが、いい勉強となりました。反省。
: