2013-03-25 431 views
9

如果我在00:00使用System.currentTimeMillis()并且我得到X值。System.currentTimeMillis();如果我改变系统时间

然后我把时钟倒回一个小时,一小时后我打电话给System.currentTimeMillis()

还会再返回X,否则将只是X + 3600 * 1000

+0

根据javadoc,它返回当前时间和1970年1月1日午夜之间的差值,以毫秒为单位,UTC。* =>所以如果更改计算机的时钟,则可以期望它被调整。 – assylias 2013-03-25 16:58:45

+1

我相信没有保证。在不同的系统上,JDK必须跳过不同的环节才能获得系统时间,并且可能不会立即响应系统时钟更改。 – 2013-03-25 16:59:21

回答

10

简而言之,无论何时更改系统时间,通过System.currentTimeMillis()返回的值也会随之改变。

这与System.nanoTime()相反。

+0

我知道nanoTime(),但我读到它比currentTimeMillis贵20倍,所以我宁愿避免这一点。我不需要太高的精度(半秒的错误可能会非常好)。有没有其他的选择,或者我应该只使用nanoTime? – Twinone 2013-03-25 17:09:22

+0

@TwinOneAndroid几十个cpu周期的20倍仍然不多,除非你每秒钟称之为数千次......关于它的更多信息[https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks]。 – assylias 2013-03-25 17:17:52

+2

@TwinOneAndroid为了测量*时间跨度*,我相信你应该总是**使用'nanoTime()'。 (不记得确切的原因,与系统时间有关的行为在某些方面违反了行为,因此请记住这一点。) – millimoose 2013-03-25 17:47:11

0

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

1

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