我运行了一个简单的测试来创建一百万个时间对象并测试以下
int nano = new Timestamp(new Date().getTime()).getNanos();
if((nano & 0x00000000003F) != 0x0) {
System.out.println("Nano from timestamp : " + nano);
}
没有输出意味着最后最不重要的6位数都是零。那么,Timestamp只取决于从System.currentTimeMillis()返回的值,只是将它乘以1000000?
时间戳是否有用纳秒级精度?在当前情况下,由于我没有得到任何非零值,这意味着精度只会减少到毫秒(而不是纳秒)。
那么使用Timestamp有什么好处?
答案 0 :(得分:2)
类型java.sql.Timestamp
使用单独的字段具有纳秒级精度,如下所示:
注意:此类型是
java.util.Date
和单独的组合 纳秒值。只有整数秒存储在java.util.Date
组件。小数秒 -nanos
- 是 分开。
您正在使用java.util.Date.getTime()
设置时间戳值,该值仅提供毫秒级精度:“返回自此Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。” ;该毫秒值的亚秒值存储在nanos字段中,换句话说,纳米级的亚毫秒值为零。
如果要使用纳秒精度,则需要单独设置和获取nanos(使用setNanos
和getNanos
),或者需要从具有纳秒精度的类型构造它(java.time.LocalDateTime
)使用Timestamp.valueOf(java.time.LocalDateTime)
。
鉴于nanos存储了所有小数秒,使用setNanos
有一些警告,请参阅java.sql.Timestamp way of storing NanoSeconds的一些答案
这就是说,如果您使用的数据库实际上支持它,您将只能从这个纳秒精度中受益。例如,我维护Firebird的JDBC驱动程序,Firebird仅支持100微秒精度,而不支持纳秒级精度,例如PostgreSQL支持微秒级精度。