Как вычислить прошедшее время события в 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;
}