2012-09-10 54 views
3

如果我理解正確,即使系統時間已更改,使用System.nanoTime()也是比System.currentTimeInMillis()更準確地將標記保留爲當前時間的方法。那麼爲什麼當我將nanoTime()的長整數值轉換爲Calendar對象時,輸出是錯誤的呢?爲什麼將System.nanoTime()轉換爲Calendar對象給我錯誤的當前日期?

import java.util.Calendar; 

public class Test { 

    public static void main(String[] args) { 
     Calendar c = Calendar.getInstance(); 
     c.setTimeInMillis(System.currentTimeMillis()); 
     System.out.println(c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE) + " " + c.get(Calendar.YEAR) + 
       " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) 
       + ":" + c.get(Calendar.MILLISECOND)); 
    } 

} 
+2

'nanoTime'返回時間爲納秒級,如果你喂值'setTimeInMillis'有一個「單位不匹配」( ns與ms) – 2012-09-10 06:14:44

+0

如何解決單位不匹配問題? –

+2

你的代碼與這個問題有什麼關係?你不使用nanoTime。要將ns轉換爲ms,您只需將它除以10^6;) – Burkhard

回答

8

System.nanotime()的Javadoc表明:

返回最準確的可用的系統計時器的當前值,以毫微秒。

此方法只能用於測量已用時間,並且不涉及任何其他系統或掛鐘時間的概念。返回的值表示自某些固定但隨意​​的時間以來的納秒(可能在將來,因此值可能爲負)。該方法提供了納秒精度,但不一定是納秒精度。沒有保證值的變化頻率。由於數值溢出,連續調用中跨度大於約292年(263納秒)的差異將無法準確計算經過時間。

例如,測量一些代碼需要多長時間來執行:

long startTime = System.nanoTime(); 
// ... the code being measured ... 
long estimatedTime = System.nanoTime() - startTime; 
+0

啊,所以'nanoTime'只用於計算精確到毫秒的持續時間。它*不代表自從epoch *(Jan01/1970)以來的納秒。我想知道爲什麼官方文件使用如此難懂的英文來正確解釋它。 – Ammar

相關問題