Как вычислить прошедшее время события в java?

Какой простой / простой способ получить доступ к системным часам с помощью Java, чтобы я мог вычислить прошедшее время события?

Я бы не использовал System.currentTimeMillis() для измерения прошедшего времени. currentTimeMillis() возвращает время «настенных часов», которое может измениться (например: переход на летнее время, пользователь admin, изменяющий часы) и исказить интервальные измерения.

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 также имеет class StopWatch, подходящий только для вашей цели. Он использует System.currentTimeMillis (), поэтому у вас все еще будут проблемы с разрешением, но вы можете приостановить и сделать время круга и т. Д. Я использую его как стандарт для статистики событий.

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

Ответ Ли является правильным.

java.time

Java 8 и более поздние версии имеют встроенную инфраструктуру java.time.

Instant – это момент на шкале времени в UTC с разрешением наносекунд (до 9 цифр десятичной доли секунды). now метод захватывает текущий момент времени.

 Instant now = Instant.now(); 

2016-03-12T04: 29: 39.123Z

Вы можете рассчитать истекшее время между парой Instant объектов как Duration . Длительность использует наносекундное разрешение с максимальным значением секунд, которое может удерживаться в течение длительного времени. Это больше, чем текущий расчетный возраст Вseleniumной.

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

Выход по умолчанию Duration::toString умолчанию соответствует стандарту ISO 8601 . Вы также можете запросить общее количество наносекунд ( toNanos ) или миллисекунд ( toMillis ), а также другие суммы.

Java 8

В Java 8 выборка текущего момента разрешается только до миллисекундного разрешения (до трех цифр десятичной доли секунды). Поэтому, в то время как classы java.time могут хранить наносекунды, они могут определить текущий момент с миллисекундами. Это ограничение связано с устаревшей проблемой (для реализации по умолчанию Clock используется System.currentTimeMillis() ).

Java 9

В Java 9 и более поздних версиях реализация Clock по умолчанию может определять текущий момент до разрешения наносекунд. Фактически это зависит от тонкости аппаратных средств вашего компьютера.

См. Страницу с выпуском OpenJDK для получения дополнительной информации: Увеличьте точность реализации java.time.Clock.systemUTC ()

Micro Benchmark

Если ваша цель – бенчмаркинг, обязательно посмотрите на другие вопросы, такие как:

  • Как написать правильный микро-тест в Java?
  • Создать быстрый / надежный тест с java?

Рамки доступны для поддержки краткосрочного бенчмаркинга.

java.lang.System.currentTimeMillis() или java.lang.System.nanoTime() должен работать для измерения прошедшего времени.

Вот небольшой class 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; } 
Давайте будем гением компьютера.