3 回答

TA貢獻1864條經驗 獲得超6個贊
理論上,可以將當前時間精確到納秒級,如下所示:
Clock clock = Clock.systemDefaultZone();
Instant instant = clock.instant(); // or Instant.now();
long seconds = instant.getEpochSecond();
long nano = instant.getNano();
// epoch nanoseconds = seconds * 10E9 + nano
問題:
該systemDefaultZone()調用為平臺提供了“最佳可用時鐘”。JVM 規范說這可能比毫秒精度更好,但這不能保證。因此該nano值的精度可能不會超過毫秒。
seconds 和 nano 的值取決于本地硬件時鐘的準確性。在許多系統上,保持本地時鐘與“真實”時間同步是很困難的。通常,亞毫秒級精度具有挑戰性,而明顯的納秒級精度只是一種錯覺。
即使您已經設法將硬件時鐘與“實時”時間同步到納秒精度,進行上述調用以獲取紀元納秒時間的開銷和可變性將破壞納秒精度。(諸如內存緩存可變性、主內存總線的繁忙程度等。以及自上次同步以來本地硬件時鐘的漂移。)
實際上,在大多數系統上,納秒精度是無法實現的,因此您需要避免依賴于此的設計/算法。

TA貢獻1818條經驗 獲得超8個贊
從Instant.now(). 這是否足以解決你的問題,我不敢說。當然,在普通計算機上無法獲得納秒精度。
您可能需要通過添加人工納秒來玩一些技巧,以防Instant.now()兩次返回相同的值。
或者簡單地使用鏈接中提到的技巧:
引入一個任意的新標簽來強制唯一性。
對于添加人工納秒的技巧,您可以使用以下內容:
public class TimeProvider {
Instant last = Instant.now().minusSeconds(1);
Instant getUniqueInstant() {
Instant result = Instant.now();
if (! result.isAfter(last)) {
result = last.plusNanos(1);
}
last = result;
return result;
}
}
當我在我的計算機上從這個類中快速連續繪制時間時,我得到如下結果。從輸出看來(我解釋它的方式):
我的 JVM 無法從系統時鐘獲得比微秒(秒為 6 位小數)更高的精度。
不時添加一個人工納秒以保持瞬間的獨特性。
.
2018-08-29T15:18:35.617616001Z
2018-08-29T15:18:35.617617Z
2018-08-29T15:18:35.617618Z
2018-08-29T15:18:35.617618001Z
2018-08-29T15:18:35.617619Z
2018-08-29T15:18:35.617619001Z
2018-08-29T15:18:35.617620Z
2018-08-29T15:18:35.617620001Z
2018-08-29T15:18:35.617621Z
2018-08-29T15:18:35.617621001Z
2018-08-29T15:18:35.617622Z
2018-08-29T15:18:35.617623Z
2018-08-29T15:18:35.617623001Z
2018-08-29T15:18:35.617624Z
2018-08-29T15:18:35.617624001Z
2018-08-29T15:18:35.617625Z
2018-08-29T15:18:35.617625001Z
2018-08-29T15:18:35.617626Z
2018-08-29T15:18:35.617626001Z
2018-08-29T15:18:35.617627Z
2018-08-29T15:18:35.617627001Z
2018-08-29T15:18:35.617628Z
2018-08-29T15:18:35.617631Z
2018-08-29T15:18:35.617634Z
2018-08-29T15:18:35.617635Z
2018-08-29T15:18:35.617636Z
2018-08-29T15:18:35.617636001Z
2018-08-29T15:18:35.617637Z
2018-08-29T15:18:35.617637001Z
2018-08-29T15:18:35.617638Z
添加回答
舉報