簡體   English   中英

Java中的納秒時間,不使用java.util.Date

[英]Nanosecond Time in Java Without Using java.util.Date

我需要盡可能少的垃圾收集(GC),非常精確和准確的時間,理想情況下每天1次。 System.currentTimeMillis()不夠精確, System.nanoTime()不是准確的時間源。 唯一可以提供我想要的東西是java.util.Date.getTime()但它不是靜態方法所以每次我需要精確和准確的時間時我必須創建一個新的Date對象,這會導致更多的GC被觸發經常。

有誰知道Date類如何獲得准確和精確的時間? 我希望采用Date的方法並定制它以最小化對象創建。 要總結我的問題,請參閱以下內容:

long nanosSinceEpoch;
nanosSinceEpoch = System.currentTimeMillis(); // Not precise
nanosSinceEpoch = System.nanoTime();          // Not accurate
nanosSinceEpoch = new Date().getTime();       // Too many objects

編輯:

我不確定為什么我認為System.currentTimeMillis()new Date().getTime()是不同的但事實證明它們是相同的。 但遺憾的是,這並沒有解決我的問題。

此外, getNano()java.time.Instant似乎只有毫秒。

Instant.now

Java 9帶來了全新的Clock實現,能夠以比Java 8 Clock毫秒級能力更精確的精度捕獲當前時刻。

Instant instant = Instant.now() ;

讓我說清楚: 所有 Java版本中的Instant能夠以納秒為單位保存一個值。 但是捕獲當前時刻僅限於版本8中的毫秒。

您應該研究當前計算機設備的硬件時鍾功能。 我相信你會發現當前的傳統硬件無法准確跟蹤納秒時間。

在macOS Sierra上使用Oracle JDK 9.0.4時,我看到當前時刻以微秒為單位 ,小數點后六位數。

System.nanoTime()不是准確的時間來源

不,准確性不是問題。 問題在於System.nanoTime() 用於跟蹤已用時間 ,而不是當前日期時間。 此功能僅跟蹤自任意未記錄的起始點以來的納秒計數。

而且,如上所述,我們不是在談論增加單納秒,因為當前的傳統計算機硬件不具備。


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

您可以直接與數據庫交換java.time對象。 使用符合JDBC 4.2或更高版本的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

System.nanoTime()不是准確的時間來源

這不是真的。 其准確性高度依賴於系統 如果您可以控制硬件和操作系統,那么即使在較舊的Java版本上,您也可以從中構建高精度時鍾。

JDK-8068730實施以來,較新的時間API通過推遲最精確的OS時鍾來保護您免受這些復雜性的影響,而后者將進行必要的硬件特征檢測,以確定TSC是否足夠可靠以便用作時間資源。

暫無
暫無

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

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