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