[英]Does java.sql.Timestamp provide nanosecond precision that is useful?
我运行了一个简单的测试来创建一百万个时间对象,并测试了以下内容
int nano = new Timestamp(new Date().getTime()).getNanos();
if((nano & 0x00000000003F) != 0x0) {
System.out.println("Nano from timestamp : " + nano);
}
没有任何输出表示最后的最低有效6位全为零。 那么,时间戳是否仅取决于System.currentTimeMillis()返回的值并将其乘以1000000?
时间戳是否具有纳秒精度有用? 在当前情况下,由于我没有得到任何非零值,这意味着精度仅降低到毫秒(而不是纳秒)。
那么使用时间戳记有什么好处?
java.sql.Timestamp
类型使用单独的字段具有纳秒级的精度,如记录所示:
注意:此类型是
java.util.Date
和单独的纳秒值的组合。 仅整数秒存储在java.util.Date
组件中。 小数秒-nanos
-是分开的。
您正在使用java.util.Date.getTime()
设置时间戳记值,该值仅提供毫秒精度: “返回自此Date对象表示的1970年1月1日格林尼治标准时间00:00:00以来的毫秒数。” ; 该毫秒值的亚秒值存储在nanos字段中,换句话说,nanos的亚毫秒值以此方式为零。
如果要使用纳秒精度,则需要分别设置和获取纳秒(使用setNanos
和getNanos
),或者需要使用Timestamp.valueOf(java.time.LocalDateTime)
从具有纳秒精度的类型( java.time.LocalDateTime
)构造它。 Timestamp.valueOf(java.time.LocalDateTime)
。
鉴于nanos存储了所有小数秒,使用setNanos
有一些警告,另请参见java.sql.Timestamp存储NanoSeconds的方式的一些答案
这就是说,只有您所使用的数据库真正支持这种纳秒精度时,您才能从中受益。 例如,我维护了Firebird的JDBC驱动程序,而Firebird仅支持100微秒精度,而不支持纳秒精度,而PostgreSQL例如支持微秒精度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.