题
这个问题已经有一个答案在这里:
- 怎么做我的时间的方法是执行在Java? 37答案
什么是简单容易的方式接入系统时使用爪哇,这样我可以计算出的经过时间的一个事件?
解决方案
我会避免使用 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;
}