2013-03-25 430 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()