#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()
is09:59:26.319619800
, т.Е. 996300 наносекунд (или ~ 1 мс) позже.