1

使用しようとしていた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番目の間に奇妙な予期しない値を得るかもしれません。


  • システム時間を変更しない限り、これを使用できると思います。 :)とにかく、Windowsでは非常に正確ではありません。 - Tudor
  • 関連するstackoverflow.com/questions/11591000/…時間の変更が測定に影響しないことを確認する必要がある場合は、下記をご覧ください。System.nanotime()。 - assylias
  • あなたはただ時差を測定したいですか?それとも、あなたは本当に現在の時間への参照が欲しいですか? - João Silva
  • 1日のうち長期間にわたって時差を測定します。現在の時刻を参照する必要性と違いはありますか? - Matt Quiros

4 답변


4

特定の時点を参照したい場合は、間違いなく信頼できます。System.currentTimeInMillis()。あなたが説明する3つの方法は同じ方法で時間をマークします、違いはちょうどそれがどんな種類のオブジェクトで包まれるかということです。あなたがあなたのプログラムで必要とする異形を使いなさい。

プログラムの実行中に2点間の差を測定したい場合は、System.nanoTime()代わりに。

2つの別々のプログラムを実行して2つの時点間の時間差を取得するには、ユーザーがシステムクロックで遊ぶ可能性があることを恐れている場合は、外部のタイムソースに頼る必要があります。例えば、あなたは見てみることができますJava SNTP Client


  • 2回の別々のプログラム実行で2つの時点の間の差を測定したい場合はどうしますか?私の理解から、私が使用すればSystem.currentTimeInMillis()私のユーザーはどうにかしてシステム時間をいじることができますし、2回目の実行で予期しない値が出る可能性があります。 - Matt Quiros
  • @ mattquiros:編集を参照してください。 - Keppil

6

あなたが使うべきですSystem.nanoTime()、APIドキュメントから:

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

この方法経過時間の測定にのみ使用できますではない   システムや壁時計の時間に関するその他の概念に関連しています。値   固定されているが任意の時間から経過したナノ秒を表す   (おそらく将来的には、値は負になるかもしれません)。この方法   ナノ秒の精度を提供しますが、必ずしもナノ秒ではありません   正確さ。値が変更される頻度については保証されません。   連続した呼び出しの違いがおよそに及ぶ   292歳(2歳63(ナノ秒)経過時間を正確に計算しません   数値のオーバーフローによるものです。


  • これを上書きするように編集しましたが、それ以外の場合は263ナノ秒になります。これは292年よりもかなり短いです。 - Rich
  • しかし、これは単に同じではありませんcurrentTimeInMillis()正確にはナノ秒レベルまでしか正確ではありませんが、それでもデバイスまたはコンピュータのシステム時間が変更された場合には正しく動作しない可能性がありますか? - Matt Quiros
  • @ mattquirosいいえ、" ... ...システムの他の概念や実時間とは関係ありません。 - dacwe
  • @mattquirosそれはそうではないことにも注意してください「ナノ秒レベルまで正確」その名前が示唆していても。答えで指摘されているように:この方法ではナノ秒の精度が得られますが、必ずしもナノ秒の精度ではありません。値が変更される頻度については保証されません。 - assylias
  • ああ、いいです。 「現在利用可能な最も正確なシステムタイマーの値」のため、私は二度考えていました。パート(最初の文) - Matt Quiros

0

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


0

の特徴System.currentTimeMillis()長期的にはより正確になるように定期的に修正されるということです。これは、時間が逆方向に進むか、修正されると順方向に進むことを意味します。

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

リンクされた質問


関連する質問

最近の質問