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


этот вопрос уже есть ответ здесь:

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

6   51   2008-10-27 05:02:26

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;
}