System.currentTimeMillis(); 如果我更改系统时间

12

如果我在凌晨00:00使用System.currentTimeMillis(),并得到值为X

然后我把时钟往回调整一个小时,在经过一小时后再调用System.currentTimeMillis()

它会再次返回X,还是只会是X + 3600 * 1000?


根据Javadoc,它返回当前时间和协调世界时1970年1月1日午夜之间的毫秒差。因此,如果您更改计算机的时钟,可以预期它会进行调整。 - assylias
2
在不同的系统上,JDK 必须跳过不同的障碍才能获取系统时间,并且可能并不总是能立即响应系统时钟更改。 - Hot Licks
3个回答

12

简而言之,每当您更改系统时间时,System.currentTimeMillis()返回的值也会相应更改。

这与System.nanoTime()不同。


我知道nanoTime(),但是我读到它比currentTimeMillis()贵20倍,所以我更愿意避免使用它。我不需要太高的精度(半秒误差可能完全可以接受)。有没有其他替代方案,或者我应该只使用nanoTime()? - Twinone
@TwinOneAndroid 十几个 CPU 周期 仍然不算多,除非你把它称为每秒数千次... 更多信息请参见 此处 - assylias
2
@TwinOneAndroid 对于测量时间跨度,我认为你应该始终使用nanoTime()。(记不清确切原因了,与系统时间在某些方面表现出反直觉的行为有关。所以这只是一个参考建议。) - millimoose
2
nanoTime() 的作用在于当系统时钟被调整时它不会改变,因此两个时间戳之间的时间间隔将正确反映出来,而不受时钟调整的影响。 - Hot Licks
1
@HotLicks 另一个问题是 currentTimeMillis() 的粒度取决于操作系统,而事实上,nanoTime() 的分辨率应该在1毫秒以下。(参考 https://code.google.com/p/javasimon/wiki/SystemTimersGranularity ) - millimoose
但是当时钟改变(夏令时等),UTC时间不会改变,对吧?所以currentTimeMillis()不应该向前或向后跳转,对吧? - Andrew Mackenzie

1

它将返回X,因为System.currentTimeMillis()返回自纪元以来的毫秒数。这意味着它将与您的时钟同步,并计算自1970年1月1日UTC以来的秒数。


1
在Android上,您可以始终使用SystemClock.elapsedRealtime()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接