1

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

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

长启动时间 = System.nanoTime()/1000000;
while (true)
{
System.out.println((System.nanoTime()/1000000)-startTime);
}

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

1110
1112
1112
1113
1114
1118
1120

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

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

4

3 回答 3

2

这里有两个因素。

首先,evenSystem.nanoTime()不一定真的很精确——它只是使用可用的最好的时钟(并且不跟随时钟变化,所以它永远不会向后或向前跳跃)。

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

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

于 2011-03-29T17:49:38.700 回答
0

减法后除以 100 万,并使用long文字。

long startTime = System.nanoTime();

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

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

于 2011-03-29T17:11:40.693 回答
0

java.time

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

java.time 类支持高达纳秒的分辨率。但请记住,实际分辨率和精度取决于主机的硬件时钟。所以你的结果有所不同。

Instant instant = Instant.now();  

2016-01-02T12:34:56.123456789Z

要将可能的纳秒分辨率降低到毫秒,请调用该Instant::truncatedTo方法。

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

2016-01-02T12:34:56.123Z

请记住,大多数计算机硬件时钟在毫秒-微秒-纳秒的粒度上并不是很准确


小提示:虽然 java.time 类支持存储纳秒分辨率,但在 Java 8 中,传统实现Clock仅限于以毫秒而不是纳秒捕获当前时刻。Java 9带来了一个全新的实现Clock因此可以根据您的主机计算机时钟硬件和主机操作系统的能力以高达纳秒的分辨率捕获当前时刻。

于 2016-09-19T00:48:05.120 回答