我运行了一个简单的测试来创建一百万个时间对象并测试了以下内容
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
使用单独的字段具有纳秒精度,如文档所示:
Note: This type is a composite of a
java.util.Date
and a separate nanoseconds value. Only integral seconds are stored in thejava.util.Date
component. The fractional seconds - thenanos
- are separate.
您正在使用 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 支持微秒精度。
关于java - java.sql.Timestamp 是否提供有用的纳秒精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37248945/