2011-08-23 67 views
3

我正在用Java編寫一個簡單的計時器。它具有啓動和停止按鈕,以及文本視圖,顯示自定時器啓動以來經過了多長時間。如何從系統時間獲得時間增量?

它通過在System.currentTimeMillis()中設置初始時間並在循環中每秒更新當前值來實現。

問題是,如果我在計時器運行時更​​改系統時間,則整個測量將失敗。例如,如果我將時間設置回一個月,則計時器顯示負值,因爲currentTimeMillis()現在返回比初始值更小的值。

那麼,我該如何計算時間增量,這將與系統時間無關?讓這個解決方案跨平臺也會很好。

+0

請發表你試過的代碼。 – asgs

回答

10

用途:

System.nanoTime() 

這應該這樣做。它不考慮系統時間,只能用於測量已用時間。這是你想要的。你需要除以100萬來獲得經過的毫秒數。另請參閱Javadocs。

+0

*它不考慮系統時間*,通常這是因爲TSC是虛擬的不可靠的。看看David Holmes [高級JVM工程師,也支持RT java]博客:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks Cliff Click(原始熱點架構師還在繼續使用currentTimeMillis--比nanoTime便宜)。納米時間推出時,它考慮了TSC寄存器,但在插座或節能模式中不一致。 RFE:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440250 – bestsss

1

使用時間Web服務。例如thisthisthis

+1

唯一的問題是,你將不得不處理網絡延遲,但是處理這種問題的一個很好的解決方案 –

4
System.nanoTime(); 

Javadoc

此方法僅可用於測量經過時間與不相關的系統或掛鐘時間的任何其它概念。

+0

這並不意味着nanoTime與系統時鐘無關。 – bestsss

0

你可以像NTP一樣安裝惡魔,系統時間在任何方向跳躍都有很多問題,並可能導致相當多的其他問題。

System.nanoTime()不一定取決於系統時鐘 - 但它可以 - 只是確保系統時間正常進行。 修改系統時間是一項特權操作,所以有人這樣做,他們應該知道更好。

這裏是一個錯誤就同一案件中13歲:http://bugs.sun.com/view_bug.do?bug_id=4290274

HTH