Vic*_*cky 7 java timestamp jdbc nanotime
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);
}
}
Run Code Online (Sandbox Code Playgroud)
它基本上以毫秒为单位接受时间,然后提取最后3位数并使其成为纳米级.因此,对于毫秒值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;
}
Run Code Online (Sandbox Code Playgroud)
所以关于时间戳的所有讨论都表示它存储时间长达纳秒,似乎不是那么正确..不是吗?
以毫秒计的时间并不代表纳米时间.更精确它根本不可能.你应该用来Timestamp#setNanos()设置真正的纳米.
long timeInMillis = System.currentTimeMillis();
long timeInNanos = System.nanoTime();
Timestamp timestamp = new Timestamp(timeInMillis);
timestamp.setNanos((int) (timeInNanos % 1000000000));
// ...
Run Code Online (Sandbox Code Playgroud)
小智 5
自从引入以来java.time.*,有一个新的工厂方法java.sql.Timestamp:Timestamp.from(Instant.now())will 完成这项工作(具有纳秒精度)。也有Timestamp.toInstant()相反的转换方式。
| 归档时间: |
|
| 查看次数: |
17771 次 |
| 最近记录: |