我如何计算在Java中的事件经过的时间?

使用Java访问系统时钟的简单方法是什么?以便我可以计算事件的stream逝时间?

我会避免使用System.currentTimeMillis()来测量已用时间。 currentTimeMillis()返回可能会改变的“挂钟”时间(例如:夏令时,pipe理员用户更改时钟),并歪斜您的间隔测量。

另一方面, 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.lang.System.currentTimeMillis()java.lang.System.nanoTime()应该可以测量已用时间。

Leigh答案是正确的。

java.time

Java 8及更高版本内置了java.time框架。

Instant是UTC时间线上的一个时刻,分辨率为纳秒(最多9位数字,小数点后一秒)。 now方法抓住了当前的date时间。

 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

在Java 8中,获取当前时刻仅解决毫秒分辨率(最多3位数的小数部分秒)。 所以虽然java.time类可以存储纳秒,但它们只能以毫秒为单位确定当前时刻。 这个限制是由于遗留问题(默认的Clock实现使用System.currentTimeMillis() )。

Java 9

在Java 9和更高版本中,默认的Clock实现可以以高达纳秒的分辨率来确定当前时刻。 其实这样做取决于你的计算机时钟硬件的精细程度。

查看OpenJDK问题页面了解更多信息: 提高java.time.Clock.systemUTC()的实现精度

微型基准

如果您的目标是基准,请务必查看其他问题,例如:

  • 我如何在Java中编写正确的微基准testing?
  • 用java创build快速/可靠的基准?

框架可用于帮助进行短期基准testing。

这是一个小的StopWatch类,我使用System.nanoTime()来写,正如Leigh的答案中所build议的那样:

 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; }