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

问题描述 投票:0回答:1

我进行了一个简单的测试来创建一百万次对象并测试了以下内容

 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 timestamp
1个回答
4
投票

类型

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 例如支持微秒精度。

© www.soinside.com 2019 - 2024. All rights reserved.