1

System.currentTimeMillis()次の段落がJavadocに表示されていることに気付いたとき、Eclipseで使用しようとしていました。

Returns the current system time in milliseconds since January 1, 1970
00:00:00 UTC. This method shouldn't be used for measuring timeouts or
other elapsed time measurements, as changing the system time can affect
the results.

つまり、System.currentTimeMillis()この現在の時点への参照を具体的に維持したいのであれば、信頼できないということです。それでは、それを行うための最も正確な方法は何ですか?3つの方法は、現在の時刻を互いに異なる方法でマークしますか?

更新:私がやろうとしているのは、2つの別々のプログラム実行における2つの時点の差を測定することです。私が恐れているのはSystem.currentTimeMillis()、最初の実行後にユーザーがシステム時間を使用して遊んだ場合、2回目の実行中に奇妙な予期しない値が得られる可能性があることです。

4

4 に答える 4

6

System.nanoTime()API ドキュメントのを使用する必要があります。

最も正確な使用可能なシステム タイマーの現在の値をナノ秒単位で返します。

このメソッドは、経過時間を測定するためにのみ使用でき、システム時間またはウォールクロック時間の他の概念とは関係ありません。返される値は、固定された任意の時間からのナノ秒を表します (おそらく将来であるため、値は負の可能性があります)。この方法はナノ秒の精度を提供しますが、必ずしもナノ秒の精度ではありません。値が変更される頻度については保証されません。約 292 年 (2 63ナノ秒) を超える連続する呼び出しの違いは、数値のオーバーフローのため、経過時間を正確に計算できません。

于 2012-08-28T11:33:11.580 に答える
4

特定の時点を参照したい場合は、間違いなく信頼できますSystem.currentTimeInMillis()。あなたが説明する3つの方法は同じ方法で時間をマークします.違いはラップされているオブジェクトの種類だけです.プログラムで必要なバリアントを使用してください.

プログラムの実行中に 2 つの時点の差を測定する場合は、 System.nanoTime()代わりに を使用します。

2 つの別々のプログラム実行で 2 つの時点の時間差を取得するには、ユーザーがシステム クロックを操作することを恐れている場合は、外部の時間ソースに依存する必要があります。たとえば、 をご覧くださいJava SNTP Client

于 2012-08-28T11:33:14.830 に答える
0

の特徴はSystem.currentTimeMillis()、長期的により正確になるように定期的に修正されることです。これは、修正すると、時間が逆行したり、前にジャンプしたりすることを意味します。

System.nanoTime()単調増加しているのが特徴です。JVM 間の関連性は保証されていませんが、多くのシステムでは、最後にプロセッサがリセットされてからおおよその時間になります。つまり、再起動時にリセットされます。

于 2012-08-28T12:07:15.970 に答える
0

System.currentTimeInMillis() よりも System.nanoTime() を使用してください

于 2012-08-28T11:34:05.037 に答える