使用しようとしていたSystem.currentTimeMillis()
Eclipseで次の段落がJavadocに表示されていることに気付いたとき:
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番目の間に奇妙な予期しない値を得るかもしれません。
特定の時点を参照したい場合は、間違いなく信頼できます。System.currentTimeInMillis()
。あなたが説明する3つの方法は同じ方法で時間をマークします、違いはちょうどそれがどんな種類のオブジェクトで包まれるかということです。あなたがあなたのプログラムで必要とする異形を使いなさい。
プログラムの実行中に2点間の差を測定したい場合は、System.nanoTime()
代わりに。
2つの別々のプログラムを実行して2つの時点間の時間差を取得するには、ユーザーがシステムクロックで遊ぶ可能性があることを恐れている場合は、外部のタイムソースに頼る必要があります。例えば、あなたは見てみることができますJava SNTP Client
。
System.currentTimeInMillis()
私のユーザーはどうにかしてシステム時間をいじることができますし、2回目の実行で予期しない値が出る可能性があります。 - Matt Quiros
あなたが使うべきですSystem.nanoTime()
、APIドキュメントから:
最も正確に利用可能なシステムタイマーの現在の値を返します。 ナノ秒単位。
この方法経過時間の測定にのみ使用できますではない システムや壁時計の時間に関するその他の概念に関連しています。値 固定されているが任意の時間から経過したナノ秒を表す (おそらく将来的には、値は負になるかもしれません)。この方法 ナノ秒の精度を提供しますが、必ずしもナノ秒ではありません 正確さ。値が変更される頻度については保証されません。 連続した呼び出しの違いがおよそに及ぶ 292歳(2歳63(ナノ秒)経過時間を正確に計算しません 数値のオーバーフローによるものです。
currentTimeInMillis()
正確にはナノ秒レベルまでしか正確ではありませんが、それでもデバイスまたはコンピュータのシステム時間が変更された場合には正しく動作しない可能性がありますか? - Matt Quiros
System.currentTimeInMillis()よりもSystem.nanoTime()を使用してください。
の特徴System.currentTimeMillis()
長期的にはより正確になるように定期的に修正されるということです。これは、時間が逆方向に進むか、修正されると順方向に進むことを意味します。
の特徴System.nanoTime()
それは単調に増加しているということです。これはJVM間の関連性が保証されているわけではありませんが、多くのシステムでは、最後にプロセッサがリセットされてからほぼ経過した時間です。つまり、再起動時にリセットされます。
System.nanotime()
。 - assylias