簡體   English   中英

System.nanoTime 和 System.currentTimeMillis()

[英]System.nanoTime and System.currentTimeMillis()

我在 Windows 上使用 JDK8,在 Linux 上使用 JDK8

  1. 當我在 Windows 上運行System.nanoTime()/System.currentTimeMillis()時,結果是49
 System.nanoTime(): 74786833960332 System.currentTimeMillis():1507786236263
  1. 在Linux上運行,結果是26236
 System.nanoTime(): 39560110918205325 System.currentTimeMillis():1507786262105

我對結果感到困惑,這兩個值相差如此之大。

另外,我認為 nanoTime 是1,000,000次毫秒,因此上面的兩個值對我來說都是錯誤的(也就是說,它們都應該約為 1000000)

蘋果和橙子

System.nanotime與當前日期和時間無關。 它的目的是計算經過的時間。

您的數學計算以及與System.currentTimeMillis()比較根本沒有任何意義。 這兩個功能是不可比的。

在發布到 Stack Overflow 之前閱讀文檔。

對於日期時間處理,您根本不應該使用System類。 而是使用內置於 Java 8 及更高版本中的行業領先的 java.time 類。

  • 如果您想要 UTC 中的當前時刻,請調用Instant.now()
  • 如果您想要時區中的當前時刻,請調用ZonedDateTime.now

在 Java 9 及更高版本中,這兩個類都使用Clock的新實現以高達納秒的分辨率捕獲當前時刻。 但請記住,主流計算機缺乏具有如此高靈敏度的硬件時鍾。 截至 2017 年,微秒可能是您在現實世界中看到的最佳分辨率。

根據System.nanotime()文檔,它不是以納秒為單位的system time ,也與System.currenTimeMillis無關。 它是平台相關的(這就是差異的原因)納秒生成器,它用於測量兩次調用之間經過的時間。

Java 系統文檔

[System.nanoTime] 返回正在運行的 Java 虛擬機的高分辨率時間源的當前值,以納秒為單位。

這意味着System.nanoTime()以 nanos 為單位返回 JVM 的運行時間,而System.currentTimeMillis()返回自 UTC 1970 年 1 月 1 日午夜起以毫秒為單位的時間。

這會導致每次運行的 nanoTime 不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM