Как рассчитать прошедшее время события в java? [дубликат]
этот вопрос уже есть ответ здесь:
как я могу время выполнения метода в Java?
36 ответов
каков простой / легкий способ доступа к системным часам с помощью Java, чтобы я мог вычислить прошедшее время события?
6 ответов:
Я бы избегал использовать
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 также имеет класс секундомера, подходящий именно для вашей цели. Он использует систему.currentTimeMillis (), поэтому у вас все равно будут проблемы с разрешением, но вы можете приостановить и сделать время круга и т. д. Теперь я использую его как стандарт для статистики событий.
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
The ответ Ли является правильным.
java.время
Java 8 и позже имеет java.временные рамки встроены.
An
Instantэто момент на временной шкале в формате UTC с разрешением наносекунды (до 9 цифр десятичной доли секунды). Элементnowметод захватывает текущий момент времени даты.Instant now = Instant.now();2016-03-12T04:29: 39.123 Z
вы можете рассчитать прошедшее время между парой
InstantобъектDuration. Продолжительность использует разрешение наносекунды с максимальным значением секунд, которые могут быть проведены в течение длительного времени. Это больше, чем текущий предполагаемый возраст Вселенной.Duration duration = Duration.between( startInstant , stopInstant );вывод по умолчанию
Duration::toStringв стандартном ISO 8601. Вы также можете запросить общее количество наносекунд (toNanos) или миллисекундах (toMillis), а также другие суммы.Java 8
в Java 8 извлечение текущего момента разрешается только с разрешением миллисекунды (до 3 цифр десятичной доли секунды). Так что пока Ява.время занятий может магазине наносекунды они могут определить только текущий момент с миллисекундами. Это ограничение связано с устаревшей проблемой (по умолчанию
Clockреализация используетSystem.currentTimeMillis()).Java 9
в Java 9 и более поздних версиях, по умолчанию
Clockреализация может определить текущий момент в разрешении до наносекунды. На самом деле это зависит от тонкости оборудования часов вашего компьютера.см. эту страницу проблемы OpenJDK для получения дополнительной информации:повышение точности реализации java.время.Часы.systemUTC ()
Микро-Тест
если ваш цель бенчмаркинга, обязательно посмотрите на другие вопросы, такие как:
рамки доступны для оказания помощи в краткосрочном бенчмаркинге.
java.lang.System.currentTimeMillis()илиjava.lang.System.nanoTime()должен работать для измерения прошедшего времени.
вот небольшой класс секундомера, который я написал с помощью системы.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; }
Comments