Получение точного времени с помощью Java до миллисекунды - PullRequest
1 голос
/ 29 марта 2011

Я искал ответ на мою дилемму и нашел несколько полезных советов, но ничего, что отвечало бы на мой конкретный вопрос, поэтому я надеялся, что кто-то здесь сможет мне помочь.

Я 'Я пытаюсь получить точное время до миллисекунды в Java.Я использую System.nanoTime (), чтобы узнать текущее время и реализую его в следующем коде.Имейте в виду, это был код, который я использовал для проверки его точности.

long startTime = System.nanoTime () / 1000000;
while (true)
{
System.out.println ((System.nanoTime () / 1000000) -startTime);
}

Часть вывода выглядит следующим образом.

1110
1112
1112
1113
1114
1118
1120

Первая цифра - это номерсекунды, секунды, десятые доли секунды, третьи, сотые, а затем последние тысячные.Вы не можете видеть это здесь, но у меня есть точность к сотому месту - никаких пропущенных или повторных чисел.Тысячи, однако, далеко не точны.0 -> 2 -> 2 -> 3 -> 4 -> 8 -> 0. Для того, что я делаю, мне нужна точность до тысячного места, и из всего, что я прочитал, похоже, что System.nanoTime () должен бытьв состоянии обеспечить точность до миллисекунды.

Я делаю что-то не так или есть другой способ получить точность до миллисекунды?

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Здесь есть два фактора.

Во-первых, даже System.nanoTime() не обязательно действительно точен - он просто использует самые мелкие из доступных часов (и не следит за изменениями часов, поэтому он никогда не идет назад или не прыгает вперед).

Во-вторых, ваша Java-программа - не единственная программа, работающая на вашем компьютере, поэтому ваш код (который по сути является вызовом нативной функции nanoTime и выводом результата) каждый раз будет занимать по-разному много времени. Например, может случиться так, что одному выходу требуется больше, чем полная миллисекунда, а другому - только половина или меньше.

Попробуйте вывести еще несколько цифр (то есть разделить на меньшее число), результаты будут полезны для понимания.

0 голосов
/ 19 сентября 2016

java.time

Старые классы даты и времени теперь заменены классами java.time.

Классы java.time поддерживают разрешение до наносекунд .Но помните, что фактическое разрешение и точность зависят от аппаратных часов главного компьютера.Таким образом, ваши результаты будут различаться.

Instant instant = Instant.now();  

2016-01-02T12: 34: 56.123456789Z

Уменьшить можно с наносекунда * разрешение 1017 * до миллисекунды , вызовите метод Instant::truncatedTo.

Instant instantTruncated = Instant.now().trucatedTo( ChronoUnit.MILLIS );

2016-01-02T12: 34: 56.123Z

Имейте в виду, что большинство компьютерных аппаратных часов не очень точны в гранулярности миллисекунд-микросекунд-наносекунд.


Незначительное замечание: хотя классы java.time поддерживают с сохранением наносекундного разрешения, в Java 8 устаревшая реализация Clock ограничена захватом текущего моментатолько миллисекундами, а не наносекундами. Java 9 приносит свежую реализацию из Clock, поэтому текущий момент может быть зафиксирован с точностью до наносекунды в зависимости от возможностей аппаратного оборудования вашего главного компьютераи хост ОС.

0 голосов
/ 29 марта 2011

Разделите на 1 миллион после вычитания и используйте литерал long.

long startTime = System.nanoTime();

while (true)
{
    System.out.println((System.nanoTime() - startTime)/1000000L);
}

Демо (обновлено): http://ideone.com/X5RRa

...