我知道System.nanoTime()
现在是衡量System.currentTimeInMillis()
时间的首选方法。第一个明显的原因是nanoTime()提供更精确的时序,另一个原因是我读到后者受到系统实时时钟调整的影响。 “受系统实时时钟影响”是什么意思?
答案 0 :(得分:25)
在这种情况下,我发现以下博客摘录有用:
David Holmes的如果您对测量绝对时间感兴趣,请始终使用
System.currentTimeMillis()
。请注意,它的分辨率可能相当 粗糙(虽然这绝对不是绝对时期的问题。)如果您对测量/计算经过时间感兴趣,那么 始终使用
System.nanoTime()
。在大多数系统上它会给出一个 分辨率为微秒级。请注意,这个电话 也可以在某些平台上执行微秒。
Clocks and Timers - General Overview
由于System.currentTimeMillis()
依赖于系统时间时钟,因此对时间的调整是合法的,以便及时保留。
这意味着什么调整?例如,查看Linux中CLOCK_REALTIME
的描述:
系统范围的时钟,用于测量实际(即挂钟)时间。 设置此时钟需要适当的权限。这个时钟是 受到系统时间不连续跳跃的影响(例如如果是 系统管理员手动更改时钟),并由 adjtime(3)和NTP执行的增量调整。
答案 1 :(得分:8)
只需检查方法的JavaDoc:
System.nanoTime()
“......此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关......”
System.currentTimeMillis()
“...以毫秒为单位返回当前时间....”
因此,您可以使用System.currentTimeMillis()
查看测量期间系统时间是否发生变化,您测量的间隔也会发生变化。但是,使用System.nanoTime()
方法测量间隔时,它不会改变。
答案 2 :(得分:4)
这意味着System.currentTimeMillis()
返回的值是从机器的内部时钟获得的。如果系统管理员(或NTP)更改时间,例如,如果发现时钟快速运行5分钟并且系统管理员继续并更正它,System.currentTimeMillis()
将受到影响。这意味着您甚至可以看到值减少,如果您使用它来测量间隔,则可以关闭时间。您甚至可以测量否定时间。
System.nanoTime()
返回一个从某个内部CPU计数器/时钟得到的值。任何用户或程序都不能更改此时钟测量的时间。这意味着它对于计时更加可靠。但CPU时钟在断电时会重置,因此无法找到当前的“挂钟”时间。