当前位置: 首页 > 面试题库 >

用于存储NanoSeconds的java.sql.Timestamp方法

阙阳
2023-03-14
问题内容

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()为 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的讨论都表明它可以存储高达10 ns的时间,似乎并没有那么正确。不是吗?


问题答案:

以毫秒为单位的时间不代表以毫微秒为单位的时间。更确切地说,它根本不可能。您应该用来Timestamp#setNanos()设置真正的纳米。

long timeInMillis = System.currentTimeMillis();
long timeInNanos = System.nanoTime();

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

// ...


 类似资料:
  • 本文向大家介绍PHP基于文件存储实现缓存的方法,包括了PHP基于文件存储实现缓存的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP基于文件存储实现缓存的方法。分享给大家供大家参考。具体如下: 在一些数据库数据记录较大,但是服务器有限的时候,可能一条MySQL查询就会好几百毫秒,一个简单的页面一般也有十几条查询,这个时候也个页面加载下来基本要好几秒了,如果并发量高的话服务器基本就瘫

  • 我使用Apache IO FTPSClient在FTPS服务器上放置文档时遇到问题。我能够连接到服务器。我的状态很好(返回211)。如果我要求一个目录列表,我得到空。 我没有看到任何错误。我可以通过FileZilla连接到服务器。它在TLS上使用显式FTP。 感谢任何帮助。

  • 本文向大家介绍PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】,包括了PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP基于PDO调用sqlserver存储过程的方法。分享给大家供大家参考,具体如下: 由于业务这边存储过程一直在sqlserver上面,所以要用php去调用它,然而我们本地的是

  • 图是一个好东西,能够使用图来模拟或解决很多生活问题,同时在各大比赛上都少不了有关于图的问题.图是关系与顶点与边的,那么我们该如何来存入图的信息呢? (1)直接存边 我们开一个数组,数组里每个元素是图的一条边。其中存的每一条边都包含这些信息:顶点 v 与 u , 边的权值。 这就用到结构体数组,对于无向图,只需要存两个顶点 , 有向图的话需要区分起点、终点。 // 直接存边  struct edg

  • 本文向大家介绍Android用文件存储数据的方法,包括了Android用文件存储数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android用文件存储数据的具体代码,供大家参考,具体内容如下 存储数据示例: 从文件读取数据: 注意: 1. openFileOutput()方法有两个参数: 第一个是文件名,可以不包含路径,因为文件会默认存储到data/data/包名/fil

  • 本文向大家介绍php执行多个存储过程的方法【基于thinkPHP】,包括了php执行多个存储过程的方法【基于thinkPHP】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php执行多个存储过程的方法。分享给大家供大家参考,具体如下: 从以前的使用原生代码来看,只需要将结果集关闭即可,即 使用mysqli方式,修改DbMysqli.class.php,将query函数改为: 下面就可以调