我一直在寻找我的困境的答案,并找到了一些有用的提示,但没有解决我的具体问题,所以我希望有人可以帮助我。
我试图在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()应该能够提供精确到毫秒。
我做错了什么或者是否有另一种方法可以精确到毫秒?
答案 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类支持最高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
,因此可以以高达纳秒的分辨率捕获当前时刻,具体取决于主机时钟硬件和主机操作系统的功能。