这个问题已经有一个答案在这里:

什么是简单容易的方式接入系统时使用爪哇,这样我可以计算出的经过时间的一个事件?

有帮助吗?

解决方案

我会避免使用 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还有秒表类适合你的目的。它使用的系统。currentTimeMillis(),所以你仍然会有解决问题,但是你可以暂停而做的圈速和如此。我使用它作为标准现在对事件的统计数据。

http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html

答案通过Leigh 是正确的。

java。时间

Java8和后有java。时间框架。

一个 Instant 是一个时刻在时间线上世界标准与纳秒的决议(最多9位数字的一小部分一秒)。的 now 方抓住当前日期的时刻。

Instant now = Instant.now();

2016-03-12T04:29:39.123Z

你可以计算出的经过时间之间的一对 Instant 对象为 Duration.持续时间使用秒解决的最大值秒钟,可以保持在一个长。这个大比目前估计年龄的宇宙。

Duration duration = Duration.between( startInstant , stopInstant );

默认输的 Duration::toString 是在标准 ISO8601 格式。你也可以请求总数的毫微秒(toNanos)或(单位为toMillis),以及其他数额。

Java8

在Java8、获取当前的时刻解决只能以毫秒的决议(最多3位数字的一小部分一秒)。因此,尽管java。时间类可以 商店 毫微秒他们只能确定当前的时刻毫秒。这种限制是由于遗留的问题(默认 Clock 实现使用 System.currentTimeMillis()).

Java9

在Java9和后来的,默认的 Clock 实施可以确定当前的时刻在达纳秒的决议。实际上这样做取决于细计算机的时钟的硬件。

看到这个们可根据最新的技术提供一些问题网页的更多信息: 提高精度的执行情况。时间。时钟。systemUTC()

微型基准

如果你的目的是制定基准,一定要看看其他问题,例如:

框架可用来协助的短期基准。

java.lang.System.currentTimeMillis()java.lang.System.nanoTime() 该工作来衡量经过的时间。

这里是一个小类秒表我写了使用该系统。nanoTime()作为建议的答复中从Leigh:

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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top