TimestampのgetTimeには気をつけよう。
Javaで日時を表すときはあの憎らしいCalendarクラスを使ったり、
素敵なJodaTimeライブラリを使うと思うんですが、
SQLを使うときにjava.sql.Timestampを使うことがあります。
Javaの日時に関連するクラスというのは大抵はgetTime()みたいなメソッドがあって、longを返すようになっています。
で、まぁ日時をこねくり回しているときにたまにgetTime()を使うわけで、Timestampでも同じようにつかってみたのですが、どうもうまくいかなかった。
Timestamp time1 = new Timestamp(2011 - 1900,3,11,12,34,56,123456) Timestamp time2 = new Timestamp(time1.getTime()) println time1 println time2 assertThat(time1, is(equalTo(time2)))
#printlnまでの実行結果http://ideone.com/cPEzh
みたいなコードを書いたときに失敗します。Timestampクラスはナノ秒まで保持しているのですが、time2のインスタンスにはナノ秒が存在しません。
ということで、TimestampクラスのgetTimeを見てみるとナノ秒をまるめて返していました。
ナノ秒はgetTimeで返しているlongとは別のフィールドに保持しています。
ということで、Timestampの防御的コピーをしたいときなどなどにgetTimeを使ってはいけませんね。
(逆にDateクラスに変換したいときはgetTimeが想定通りの挙動になりそうですね。)