Разница между b / W clock.systemUTC() и system.currentTimeMillis()

#java

#java

Вопрос:

Clock.systemUTC() в документах говорится, что этот метод может использовать System.currentTimeMillis() или часы с более высоким разрешением, если они доступны. Какие часы тогда System.currentTimeMillis() используются? Может ли быть разница в степени детализации этих двух значений?

Ответ №1:

Может ли быть разница в степени детализации этих двух значений?

Clock Класс имеет 2 метода для получения текущего времени:

Поскольку instant() возвращает an Instant , который может представлять время с точностью до наносекунд, ответ очевиден.

Ответ: Да.


Какие часы использует System.currentTimeMillis()?

Если вы посмотрите на исходный код Clock.systemUTC() , вы обнаружите, что он использует внутренний SystemClock класс. В комментарии к millis() методу говорится (цитируя Java 15):

System.currentTimeMillis() и VM.getNanoTimeAdjustment(offset)
используйте тот же источник времени System.currentTimeMillis() просто ограничивает разрешение миллисекундами.
Поэтому мы выбираем более быстрый путь и вызываем System.currentTimeMillis() напрямую, чтобы избежать снижения производительности VM.getNanoTimeAdjustment(offset) , которое менее эффективно.

Ответ: System.currentTimeMillis() и Clock.instant() использовать тот же источник времени.

Комментарии:

1. Теперь я понял суть вопроса и причину вашего комментария… спасибо, что указали мне на это!

2. Это проясняет ситуацию. Один вопрос — все эти системные часы с точностью до наносекунды не обязательно имеют наносекундное разрешение, не так ли?

3. Кажется, что моя Windows 10 возвращает время с точностью до 100 наносекунд в Java 9 или более поздней версии, но время имеет разрешение всего 1 миллисекунду. Например. он возвращается 09:59:26.318623500 , но следующее другое значение времени после нескольких вызовов LocalTime.now() is 09:59:26.319619800 , т.Е. 996300 наносекунд (или ~ 1 мс) позже.