イベントの経過時間を計算できるように、Javaを使用してシステム時計にアクセスする簡単で簡単な方法は何ですか?
6 に答える
System.currentTimeMillis()
経過時間の測定には使用しないでください。currentTimeMillis()
これは変更される可能性があり (例: 夏時間、管理者ユーザーによる時計の変更)、間隔の測定値が歪められる可能性があります。
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
リーの答えは正しいです。
java.time
Java 8 以降には、java.time フレームワークが組み込まれています。
anInstant
は、UTC のタイムライン上の瞬間であり、ナノ秒の解像度 (1 秒の小数点以下 9 桁まで) です。このnow
メソッドは、現在の日時の瞬間を取得します。
Instant now = Instant.now();
2016-03-12T04:29:39.123Z
Instant
オブジェクトのペア間の経過時間を として計算できますDuration
。持続時間は、long で保持できる秒の最大値でナノ秒の解像度を使用します。これは現在推定されている宇宙の年齢よりも大きい。
Duration duration = Duration.between( startInstant , stopInstant );
のデフォルトの出力Duration::toString
は、標準のISO 8601形式です。toNanos
ナノ秒 ( ) またはミリ秒( )の合計カウント、toMillis
およびその他の量を要求することもできます。
Java 8
Java 8 では、現在の瞬間の取得はミリ秒の解像度 (1 秒の小数部の最大 3 桁) にのみ解決されます。そのため、java.time クラスはナノ秒を格納できますが、現在の瞬間をミリ秒でしか判断できません。この制限はレガシーの問題によるものです (デフォルトのClock
実装では を使用していますSystem.currentTimeMillis()
)。
Java 9
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;
}