currentTimeMillis()以毫秒为单位返回当前时间
nanoTime()返回正在运行的Java Virtual的当前值 机器的高分辨率时间源,以纳秒为单位。
严格地说,纳秒是1e-9,毫秒是1e-3。因此,以纳秒为单位的持续时间必须是相同持续时间的1e6的倍数(以毫秒为单位)。实际情况并非如此,原因是什么?
scala> System.nanoTime / System.currentTimeMillis
res0: Long = 107
答案 0 :(得分:8)
System.nanoTime()
有一个任意的起点;它不是unix时代。 From the Javadoc:
返回的值表示自某些固定但任意的原始时间
以来的纳秒
所以你实际计算的是:
(unknownOffset + offsetFromEpochInNanos) / offsetFromEpochInMillis
几乎肯定不是1e6,除非unknownOffset
碰巧是零。
如果你可以通过减去两次来消除未知偏移的影响,你可以看到该比率大约是1e6:
long nanoStart = System.nanoTime();
long milliStart = System.currentTimeMillis();
Thread.sleep(2000);
long nanoEnd = System.nanoTime();
long milliEnd = System.currentTimeMillis();;
long nanoDelta = nanoEnd - nanoStart;
long milliDelta = milliEnd - milliStart;
System.out.println((double) nanoDelta / milliDelta);
输出(运行5次):
1000058.3725
1000045.4705
999549.1579210395
1000046.101
1000038.1045
所以,非常接近1e6。
请注意,可能不是这个,因为System.currentTimeMillis()
由于时钟偏差的修正而无法顺利进行。但是,这些应该是不常见的,所以大部分时间当你运行这段代码时,你会大致看到1e6。