我进行了一个简单的测试来创建一百万次对象并测试了以下内容
int nano = new Timestamp(new Date().getTime()).getNanos();
if((nano & 0x00000000003F) != 0x0) {
System.out.println("Nano from timestamp : " + nano);
}
没有输出任何内容,这意味着最后的最低有效 6 位数字全为零。那么,Timestamp 是否仅依赖于 System.currentTimeMillis() 返回的值并将其乘以 1000000?
时间戳对于纳秒精度有用吗?在当前情况下,由于我没有得到任何非零值,这意味着精度只是降低到毫秒(而不是纳秒)。
那么使用时间戳有什么好处呢?
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 存储 NanoSeconds 的方法的一些答案
也就是说,只有当您使用的数据库确实支持这种纳秒精度时,您才会受益。例如,我维护 Firebird 的 JDBC 驱动程序,Firebird 仅支持 100 微秒精度,而不支持纳秒精度,而 PostgreSQL 例如支持微秒精度。