System.nanoTime和System.currentTimeMillis()

时间:2017-10-12 05:26:33

标签: java

我在Windows上使用JDK8,在Linux上使用JDK8

  1. 当我在Windows上运行System.nanoTime()/System.currentTimeMillis()时,结果为49
  2. System.nanoTime(): 74786833960332
    
    System.currentTimeMillis():1507786236263
    
    1. 在Linux上运行时,结果为26236
    2. System.nanoTime(): 39560110918205325
      
      System.currentTimeMillis():1507786262105
      

      我对结果感到困惑,这两个值差异很大。

      另外,我认为nanoTime是1,000,000倍毫秒,所以上面的两个值对我来说都是错误的(也就是说,它们都应该是大约1000000)

3 个答案:

答案 0 :(得分:5)

苹果和橘子

System.nanotime与当前日期和时间无关。其目的是计算已过去的时间。

您的数学和与System.currentTimeMillis()的比较完全没有意义。这两个功能是无与伦比的。

在发布到Stack Overflow之前阅读文档。

对于日期时间处理,您根本不应该使用System类。而是使用Java 8及更高版本中内置的业界领先的java.time类。

  • 如果您想要UTC中的当前时刻,请致电Instant.now()
  • 如果您想要在某个时区中获得当前时刻,请致电ZonedDateTime.now

在Java 9及更高版本中,两个类都使用Clock的新实现来捕获分辨率中的当前时刻,最长可达纳秒。但请记住,主流计算机缺少具有如此高灵敏度的硬件时钟。微秒可能是2017年你在现实世界中看到的最好的分辨率。

答案 1 :(得分:4)

根据System.nanotime()文档,它不是system time,以纳秒为单位,与System.currenTimeMillis无关。它取决于平台(这就是为什么差异)纳秒生成器,它用于测量两次调用之间经过的时间。

答案 2 :(得分:3)

来自Java System documentation

  

[System.nanoTime]返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒为单位。

这意味着System.nanoTime()以纳米为单位返回JVM的已用运行时间,而System.currentTimeMillis()则返回自UTC时间1970年1月1日午夜起的时间(以毫秒为单位)。

这导致每次运行时的纳米时间不一致。