java.sql.Timestamp是否提供有用的纳秒精度?

时间:2016-05-16 07:40:17

标签: java timestamp

我运行了一个简单的测试来创建一百万个时间对象并测试以下

 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有什么好处?

1 个答案:

答案 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(使用setNanosgetNanos),或者需要从具有纳秒精度的类型构造它(java.time.LocalDateTime)使用Timestamp.valueOf(java.time.LocalDateTime)

鉴于nanos存储了所有小数秒,使用setNanos有一些警告,请参阅java.sql.Timestamp way of storing NanoSeconds的一些答案

这就是说,如果您使用的数据库实际上支持它,您将只能从这个纳秒精度中受益。例如,我维护Firebird的JDBC驱动程序,Firebird仅支持100微秒精度,而不支持纳秒级精度,例如PostgreSQL支持微秒级精度。