うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

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が想定通りの挙動になりそうですね。)