【问题标题】:Does java.sql.Timestamp provide nanosecond precision that is useful?java.sql.Timestamp 是否提供有用的纳秒精度?
【发布时间】:2016-05-16 07:40:17
【问题描述】:

我运行了一个简单的测试来创建一百万个时间对象并测试了以下

 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.util.Date.getTime()只有毫秒,所以你不能通过这种方式获得纳米。

标签: java timestamp


【解决方案1】:

java.sql.Timestamp 类型使用单独的字段具有纳秒精度,如文档所述:

注意:此类型是 java.util.Date 和单独的 纳秒值。只有整数秒存储在 java.util.Date 组件。小数秒 - nanos - 是 分开。

您正在使用 java.util.Date.getTime() 设置时间戳值,它仅提供毫秒精度:“返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。”时间>;该毫秒值的亚秒值存储在 nanos 字段中,也就是说,这样 nanos 的亚毫秒值为零。

如果要使用纳秒精度,则需要分别设置和获取 nanos(使用 setNanosgetNanos),或者您需要从具有纳秒精度的类型构造它(java.time.LocalDateTime ) 使用Timestamp.valueOf(java.time.LocalDateTime)

鉴于 nanos 存储所有小数秒,使用 setNanos 有一些注意事项,另请参阅 java.sql.Timestamp way of storing NanoSeconds 的一些答案

也就是说,只有在您使用的数据库实际支持时,您才能从这种纳秒精度中受益。比如我维护了 Firebird 的 JDBC 驱动,Firebird 只支持 100 微秒精度,而不是纳秒精度,而 PostgreSQL 例如支持微秒精度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2019-07-13
    • 2020-02-02
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多