3

私の理解が正しければ、システム時刻が変更されたとしても、 を使用System.nanoTime()するよりもマーカーを現在の時刻に保持するより正確な方法です。System.currentTimeInMillis()では、 long 値をオブジェクトに変換するnanoTime()Calendar、出力が間違っているのはなぜですか?

import java.util.Calendar;

public class Test {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
        System.out.println(c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE) + " " + c.get(Calendar.YEAR) +
                " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND)
                + ":" + c.get(Calendar.MILLISECOND));
    }

}
4

1 に答える 1

8

System.nanotime() javadoc の提案:

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

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

たとえば、一部のコードの実行にかかる時間を測定するには、次のようにします。

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
于 2012-09-10T06:16:20.070 に答える