加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java.sql.Timestamp存储NanoSeconds的方式

发布时间:2020-12-15 03:08:47 所属栏目:Java 来源:网络整理
导读:java.sql.Timestamp构造函数如下: public Timestamp(long time) { super((time/1000)*1000); nanos = (int)((time%1000) * 1000000); if (nanos 0) { nanos = 1000000000 + nanos; super.setTime(((time/1000)-1)*1000); }} 它基本上以毫秒为单位接受时间,
java.sql.Timestamp构造函数如下:
public Timestamp(long time) {
    super((time/1000)*1000);
    nanos = (int)((time%1000) * 1000000);
    if (nanos < 0) {
        nanos = 1000000000 + nanos;     
        super.setTime(((time/1000)-1)*1000);
    }
}

它基本上以毫秒为单位接受时间,然后提取最后3位数并使其成为纳米级.所以对于毫秒值1304135631 421,我得到Timestamp.getnanos()as
421000000.这是简单的计算(最后加上6个零)……似乎不是最佳的.

一种更好的方法可能是Timestamp构造函数,它接受以纳秒为单位的时间,然后计算出纳秒值.

如果运行以下程序,您将看到实际纳秒与Timestamp计算纳秒标记返回的纳秒之间的差异.

long a = System.currentTimeMillis();
    for(;;){
        long b = System.currentTimeMillis();
        Timestamp tm = new Timestamp(System.currentTimeMillis());
        System.out.println(tm.getTime());
        System.out.println(tm.getNanos());
        System.out.println("This is actual nanos" + System.nanoTime()%1000000000);
        System.out.println("--------------------------");
        if(b-a >= 1)
            break;
    }

所以关于时间戳的所有讨论都说它存储的时间长达几纳秒,似乎不是那么正确..不是吗?

解决方法

以毫秒计的时间并不代表纳米时间.更精确它根本不可能.你应该用 Timestamp#setNanos()来设置真正的纳米.
long timeInMillis = System.currentTimeMillis();
long timeInNanos = System.nanoTime();

Timestamp timestamp = new Timestamp(timeInMillis);
timestamp.setNanos((int) (timeInNanos % 1000000000));

// ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读