System.nanoTime与System.currentTimeMillis的区别

平时产生随机数时我们经常拿时间做种子,比如用System.currentTimeMillis的结果,但是在执行一些循环中使用了System.currentTimeMillis,那么每次的结果将会差别很小,甚至一样,因为现代的计算机运行速度很快。后来看到Java中产生随机数函数以及线程池中的一些函数使用的都是System.nanoTime,下面说一下这2个方法的具体区别。

System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期

在jdk中的说明如下:

public static long nanoTime()

返回最准确的可用系统计时器的当前值,以毫微秒为单位。

此方法只能用于测量已过的时间,与系统或钟表时间的其他任何时间概念无关。返回值表示从某一固定但任意的时间算起的毫微秒数(或许从以后算起,所以该值可能为负)。此方法提供毫微秒的精度,但不是必要的毫微秒的准确度。它对于值的更改频率没有作出保证。在取值范围大于约 292 年(263 毫微秒)的连续调用的不同点在于:由于数字溢出,将无法准确计算已过的时间。

例如,测试某些代码执行的时间长度:

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;

返回:

系统计时器的当前值,以毫微秒为单位。

从以下版本开始:1.5

System.currentTimeMillis返回的是从1970.1.1 UTC 零点开始到现在的时间

精确到毫秒,可以计算当前日期,星期几等,可以方便的与Date进行转换,下面时jdk中的介绍:

public static long currentTimeMillis()

返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于底层操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

请参阅 Date 类的描述,了解可能发生在“计算机时间”和协调世界时(UTC)之间的细微差异的讨论。

返回:

当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。

所以在使用中,我们可以根据我们具体的目的去正确的选择他们。

纳秒

ns(nanosecond):纳秒, 时间单位。一秒的10亿分之一,即等于10的负9次方秒。常用作 内存读写速度的单位,其前面数字越小则表示速度越快。

1纳秒 = 1000 皮秒 
1纳秒 = 0.001 微秒
1纳秒 = 0.000001 毫秒
1纳秒 = 0.00000 0001秒

java的System.currentTimeMillis()和System.nanoTime()有什么区别

java中System.nanoTime()返回的是纳秒,nanoTime而返回的可能是任意时间,甚至可能是负数……按照API的说明,nanoTime主要的用途是衡量一个时间段,比如说一段代码执行所 用的时间,获取数据库连接所用的时间,网络访问所用的时间等。另外,nanoTime提供了纳秒级别的精度,但实际上获得的值可能没有精确到纳秒。

但总的来说,这两个函数的用途是完全不一样的!

java中System.currentTimeMillis()返回的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数

Date()其实就是相当于Date(System.currentTimeMillis());

因为Date类还有构造Date(long date),用来计算long秒与1970年1月1日之间的毫秒差。。 

在开发过程中,通常很多人都习惯使用new Date()来获取当前时间,使用起来也比较方便,同时还可以获取与当前时间有关的各方面信息,例如获取小时,分钟等等,而且还可以格式化输出,包含的信息是比较丰富的。但是有些时候或许你并不需要获取那么多信息,你只需要关心它返回的毫秒数就行了,例如getTime()。为了获取这个时间戳,很多人也喜欢使用new Date().getTime()去获取,咋一看没什么问题,但其实没这个必要。

其实看一下java的源码就知道了:

public Date() { 
    this(System.currentTimeMillis()); 
}

已经很明显了,new Date()所做的事情其实就是调用了System.currentTimeMillis()。如果仅仅是需要或者毫秒数,那么完全可以使用System.currentTimeMillis()去代替new Date(),效率上会高一点。况且很多人喜欢在同一个方法里面多次使用new Date(),通常性能就是这样一点一点地消耗掉,这里其实可以声明一个引用。

最后有关时间的转换:

TimeUnit.NANOSECONDS.convert(sourceDuration, sourceUnit) 前面是你须要转换的目标时间单位,后面为要转换的源时间单位。


赞(52) 打赏
未经允许不得转载:优客志 » JAVA开发
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏