イベントの経過時間を計算できるように、Javaを使用してシステムクロックにアクセスする簡単で簡単な方法は何ですか?
経過時間の測定に System.currentTimeMillis()
を使用しないようにします。 currentTimeMillis()
'wall-clock'時間を返します。これは変更される可能性があり(例:夏時間、管理ユーザーが時計を変更する)、間隔の測定値をゆがめます。
System.nanoTime()
は、一方で、「ある基準点」からのナノ秒数(JVMの起動など)を返すため、システムクロックの変更の影響を受けません。
これはいくつかのサンプルコードです。
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Apache Commons-Langには、目的に合ったStopWatchクラスもあります。 System.currentTimeMillis()を使用しているため、解像度の問題は引き続き発生しますが、一時停止してラップタイムなどを行うことができます。現在、イベント統計の標準として使用しています。
http://commons.Apache.org/lang/api-release/org/Apache/commons/lang/time/StopWatch.html
Answer by Leigh は正しいです。
Java 8以降には、Java.timeフレームワークが組み込まれています。
Instant
は、ナノ秒の解像度(秒の小数部の最大9桁)を持つUTCのタイムライン上の瞬間です。 now
メソッドは、現在の日時を取得します。
_Instant now = Instant.now();
_
2016-03-12T04:29:39.123Z
Instant
オブジェクトのペア間の経過時間を Duration
として計算できます。期間はナノ秒の解像度を使用し、最大値は長時間保持できます。これは、宇宙の現在の推定年齢よりも大きいです。
_Duration duration = Duration.between( startInstant , stopInstant );
_
_Duration::toString
_ のデフォルト出力は、標準の ISO 8601 形式です。ナノ秒( toNanos
)またはミリ秒( toMillis
)の合計数、およびその他の量を要求することもできます。
Java 8、現在の瞬間をフェッチすると、ミリ秒の解像度(1秒の小数点以下3桁まで)しか解決されません。したがって、Java.timeクラスはstoreナノ秒は、ミリ秒で現在の瞬間のみを決定できます。この制限は、レガシーの問題によるものです(デフォルトの Clock
実装では System.currentTimeMillis()
) 。
Java 9以降では、デフォルトのClock
実装が現在の瞬間を最大ナノ秒の解像度で決定できます。実際にそうするかどうかは、コンピューターのクロックハードウェアの精度に依存します。
詳細については、このOpenJDKの問題ページを参照してください: Java.time.Clock.systemUTC()の実装の精度を高めます
目的がベンチマークである場合、次のような他の質問を必ず確認してください。
短期間のベンチマークを支援するフレームワークが利用可能です。
Java.lang.System.currentTimeMillis()
またはJava.lang.System.nanoTime()
は、経過時間を測定するために機能する必要があります。
以下は、Leighの回答で提案されたSystem.nanoTime()を使用して作成した小さなStopWatchクラスです。
public class StopWatch {
// Constructor
public StopWatch() {
}
// Public API
public void start() {
if (!_isRunning) {
_startTime = System.nanoTime();
_isRunning = true;
}
}
public void stop() {
if (_isRunning) {
_elapsedTime += System.nanoTime() - _startTime;
_isRunning = false;
}
}
public void reset() {
_elapsedTime = 0;
if (_isRunning) {
_startTime = System.nanoTime();
}
}
public boolean isRunning() {
return _isRunning;
}
public long getElapsedTimeNanos() {
if (_isRunning) {
return System.nanoTime() - _startTime;
}
return _elapsedTime;
}
public long getElapsedTimeMillis() {
return getElapsedTimeNanos() / 1000000L;
}
// Private Members
private boolean _isRunning = false;
private long _startTime = 0;
private long _elapsedTime = 0;
}