System.nanoTime()的初始值是在本JVM實例啟動時"隨機"選擇的一個數字,隨着JVM的運行而遞增(常用來計算實時時間差),System.currentTimeMillis表示系統時間,這就導致了的它們的幾個差別:
- System.currentTimeMillis()表示系統時間(即UTC). System.nanoTime()無法表示當前時間,本質上它是一個隨機數字.
- 在同一機器上的不同JVM上,System.currentTimeMillis是相同的,System.nanoTime()是不同的.
- System.currentTimeMillis()系統時間敏感,System.nanoTime()系統時間不敏感.比如我們將系統時間往前調一秒,System.currentTimeMillis()相比修改前會減少1000.而System.nanoTime()不會變化.
基於System.nanoTime()系統時間不敏感的特性,它被廣泛應用在需要相對時間的場景中,如ScheduledThreadPoolExecutor,在0點0分添加一個1小時后執行的任務,那么只有在系統運行1小時后,它才會被觸發,在此期間無論如何修改系統時間都不會影響.
轉載:https://www.jianshu.com/p/4fc9c3238164

