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)); // ...
原文地址:https://www.jb51.cc/java/128939.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。