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 位数字并将其设为 nanos。因此,对于 1304135631 421的毫秒值,我得到 Timestamp.getnanos() 为 421000000。这是简单的计算(最后添加 6 个零)......似乎不是最佳的。
更好的方法可能是 Timestamp 构造函数,它接受以纳秒为单位的时间,然后从中计算出纳秒值。
如果您运行以下程序,您将看到实际纳秒与 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;
}
所以所有关于 Timestamp 的讨论都说它存储时间长达纳秒,似乎并不那么正确..不是吗?