使用Java到毫秒获得精确的经过时间

时间:2011-03-29 17:07:53

标签: java time elapsed

我一直在寻找我的困境的答案,并找到了一些有用的提示,但没有解决我的具体问题,所以我希望有人可以帮助我。

我试图在Java中获得精确的毫秒时间。我正在使用System.nanoTime()来获取当前时间并在以下代码中实现它。请注意,这是我用来测试它的精度的代码。

  

long startTime = System.nanoTime()/ 1000000;
  而(真)
  {
      的System.out.println((System.nanoTime()/ 1000000)-StartTime);
      }

输出的一部分看起来像这样。

  

1110
  1112
  1112
  1113
  1114
  1118
  1120

第一个数字是秒数,秒数,十分之一秒,第三个数字,百分之一秒,然后是最后一个数字是千分之一。你不能在这里看到它,但我有精确到百分之一的地方 - 没有跳过或重复的数字。然而,千分之一远不准确。 0 - > 2 - > 2 - > 3 - > 4 - > 8 - > 0.对于我正在做的事情,我需要精确到千分之一的地方,从我看过的所有内容看起来似乎System.nanoTime()应该能够提供精确到毫秒。

我做错了什么或者是否有另一种方法可以精确到毫秒?

3 个答案:

答案 0 :(得分:2)

这里有两个因素。

首先,即使System.nanoTime()也不一定非常精确 - 它只使用最好的时钟(并且不会跟随时钟变化,因此它永远不会倒退或向前跳跃)。

其次,您的Java程序不是您计算机上运行的唯一程序 - 因此您的代码(本质上是调用本机nanoTime函数和结果的输出)每次将花费不同的时间。例如,一个输出可能需要超过一个毫秒,而另一个只需要一半或更少。

尝试输出更多数字(即除以较小的数字),结果将有助于理解。

答案 1 :(得分:0)

减法后除以1百万,并使用long字面值。

long startTime = System.nanoTime();

while (true)
{
    System.out.println((System.nanoTime() - startTime)/1000000L);
}

演示(更新):http://ideone.com/X5RRa

答案 2 :(得分:0)

java.time

旧的日期时间类现在被java.time类取代。

java.time类支持最高nanoseconds的分辨率。但请记住,实际的分辨率和准确度取决于主机的硬件时钟。因此,您的结果变化。

Instant instant = Instant.now();  
  

2016-01-02T12:34:56.123456789Z

要将可能的nanosecond分辨率降低到milliseconds,请调用Instant::truncatedTo方法。

Instant instantTruncated = Instant.now().trucatedTo( ChronoUnit.MILLIS );
  

2016-01-02T12:34:56.123Z

请注意,大多数计算机硬件时钟非常准确,其粒度为毫秒 - 微秒 - 纳秒。

次要注意:虽然java.time类支持存储纳秒分辨率,但在Java 8中Clock的遗留实现仅限于捕获当前时刻只有毫秒而不是纳秒。 Java 9带来fresh implementation Clock,因此可以以高达纳秒的分辨率捕获当前时刻,具体取决于主机时钟硬件和主机操作系统的功能。