繁体   English   中英

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

[英]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的亚毫秒值以此方式为零。

如果要使用纳秒精度,则需要分别设置和获取纳秒(使用setNanosgetNanos ),或者需要使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM