java.sql.Timestampコンストラクタは次のようになります。
public Timestamp(long time) {
super((time/1000)*1000);
nanos = (int)((time%1000) * 1000000);
if (nanos < 0) {
nanos = 1000000000 + nanos;
super.setTime(((time/1000)-1)*1000);
}
}
基本的にミリ秒単位の時間を受け入れ、最後の3桁を抽出してナノにします。したがって、ミリ秒の値が1304135631 421の場合、Timestamp.getnanos()を 421000000として取得します。これは単純な計算です(最後に6つのゼロを追加します)...最適ではないようです。
より良い方法は、ナノ秒単位の時間を受け取り、そこからナノ秒の値を計算するTimestampコンストラクターである可能性があります。
以下のプログラムを実行すると、実際のナノ秒と、タイムスタンプによるナノ秒の計算方法によって返されるナノ秒の違いがわかります。
long a = System.currentTimeMillis();
for(;;){
long b = System.currentTimeMillis();
Timestamp tm = new Timestamp(System.currentTimeMillis());
System.out.println(tm.getTime());
System.out.println(tm.getNanos());
System.out.println("This is actual nanos" + System.nanoTime()%1000000000);
System.out.println("--------------------------");
if(b-a >= 1)
break;
}
したがって、タイムスタンプに関するすべての議論は、最大ナノ秒の時間を保存すると言っていますが、それほど正しくないようです。