Какой простой/простой способ получить доступ к системным часам с помощью Java, чтобы я мог вычислить прошедшее время события?
Как вычислить прошедшее время события в java?
Ответ 1
Я бы не использовал System.currentTimeMillis()
для измерения прошедшего времени. currentTimeMillis()
возвращает время "настенных часов", которое может измениться (например: переход на летнее время, пользователь admin, изменяющий часы) и перекос вашего интервала измерения.
System.nanoTime()
, с другой стороны, возвращает количество наносекунд, так как„какой-то точки отсчета“(например, JVM запуска), и поэтому не будет подвержен изменениям системных часов.
Ответ 2
Это пример кода.
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Ответ 3
Apache Commons-Lang также имеет класс StopWatch, подходящий только для вашей цели. Он использует System.currentTimeMillis(), поэтому у вас все еще будут проблемы с разрешением, но вы можете приостановить и сделать время круга и т.д. Я использую его как стандарт для статистики событий.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
Ответ 4
java.lang.System.currentTimeMillis()
или java.lang.System.nanoTime()
должны работать для измерения прошедшего времени.
Ответ 5
Ответ Leigh является правильным.
java.time
Java 8 и более поздние версии имеют встроенную инфраструктуру java.time.
An Instant
- момент на временной шкале в UTC с разрешением наносекунд (до 9 цифр десятичной доли секунды). Метод 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
В Java 8 выборка текущего момента разрешается только до миллисекундного разрешения (до трех цифр десятичной доли секунды). Поэтому, в то время как классы java.time могут хранить наносекунды, они могут определить текущий момент с миллисекундами. Это ограничение связано с устаревшей проблемой (по умолчанию Clock
использует System.currentTimeMillis()
).
Java 9
В Java 9 и более поздних версиях реализация по умолчанию Clock
может определять текущий момент до разрешения наносекунд. Фактически это зависит от тонкости аппаратных средств вашего компьютера.
См. эту страницу с проблемой OpenJDK для получения дополнительной информации: Повысить точность реализации java.time.Clock.systemUTC()
Микроконтроллер
Если ваша цель - бенчмаркинг, обязательно посмотрите на другие вопросы, например:
Рамки доступны для помощи в краткосрочном тестировании.
Ответ 6
Вот небольшой класс StopWatch, который я написал с использованием System.nanoTime(), как это было предложено в ответе Ли:
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;
}