我知道System.nanoTime()
现在是测量时间的首选方法,而不是System.currentTimeInMillis()
。第一个显而易见的原因是nanoTime()提供更精确的时间,我阅读过的另一个原因是后者会受到系统实时时钟调整的影响。那么"受到系统实时时钟调整的影响"是什么意思?
我知道System.nanoTime()
现在是测量时间的首选方法,而不是System.currentTimeInMillis()
。第一个显而易见的原因是nanoTime()提供更精确的时间,我阅读过的另一个原因是后者会受到系统实时时钟调整的影响。那么"受到系统实时时钟调整的影响"是什么意思?
只需查看方法的JavaDoc:
System.nanoTime()
"...此方法仅用于测量经过的时间,与任何其他系统或墙钟时间概念无关。..."
System.currentTimeMillis()
"...以毫秒为单位返回当前时间。..."
因此,如您所见,如果在使用System.currentTimeMillis()
进行测量期间系统时间发生更改,则您测量的间隔也将发生更改。但是,使用System.nanoTime()
方法测量间隔时不会更改。
System.currentTimeMillis()
返回的值来自机器的内部时钟。如果系统管理员(或NTP)更改了时间,例如发现时钟快了5分钟并进行更正,那么System.currentTimeMillis()
将受到影响。这意味着您甚至可能会看到该值减少,如果您用它来测量时间间隔,则计时可能会出错。您甚至可能会测量到负计时。System.nanoTime()
返回的值是从某些内部CPU计数器/时钟派生的。由此时钟测量的时间不会被任何用户或程序更改。这意味着它在计时方面更可靠。但是,CPU时钟在断电时会重置,因此它对于查找当前的“墙钟”时间没有用处。
currentTimeInMillis()
记录经过的时间,会发生什么?或者这不是它的意思吗? - telkinscurrentTimeMillis
试图测量的是时间作为一个物理现象的流逝。夏令时调整类似于旅行中的时区变化:它只影响时间以小时和分钟表示的方式,而时间本身并未受到影响。 - JonicurrentTimeMillis
不受 DST 的影响,但受闰秒等因素的影响,而nanoTime
则不同。 - Louis WassermancurrentTimeInMillis
使用“当天的时间”或绝对时钟,这是否意味着currentTimeInMillis
会受到DST的影响? - GeekcurrentTimeMillis
测量自1970年1月1日00:00 UTC以来经过的时间。在DST转换中发生的情况是调整挂钟时间:例如,在00:59:59之后的一秒钟,挂钟时间为02:00:00。但由于只有一秒钟过去了,因此currentTimeMillis
的值应该仅增加一秒钟,而不是增加一小时一秒钟。 - Joni