#java #time
#java #время
Вопрос:
Кажется System.currentTimeMillis
, это не очень точно.
Смотрите этот пример:
public class MillisTime {
public static void main(String[] args) {
long start = 0;
long end = 0;
while (true) {
if (start == 0) {
start = System.currentTimeMillis();
} else {
long current = System.currentTimeMillis();
if (current != start) {
end = current;
break;
}
}
}
System.out.println("The time interval of your OS: " (end - start) "ms");
}
}
Результат (в Windows XP):
The time interval of your OS: 15ms
Почему это не 1ms
так? И как получить точную миллисекунду текущего времени?
Ответ №1:
Это вполне ожидаемо. Вы увидите то же самое при использовании DateTime.Now
.NET. (См. Сообщение в блоге Эрика Липперта по этой теме для ориентированного на .NET представления по этой же теме.)
Вы можете использовать System.nanoTime()
, чтобы получить более точный таймер только для измерений — он не предназначен для указания абсолютного времени, он предназначен только для измерения интервалов.
Я не знаю ни одного способа получить более точное абсолютное время ни из Java, ни из Win32. Честно говоря, насколько точными будут системные часы в любом случае? Даже при регулярной синхронизации с сервером NTP я ожидал бы неточности по крайней мере в несколько миллисекунд.
В принципе, если вы полагаетесь на получение действительно точного абсолютного времени, вам, вероятно, следует изменить свой дизайн.
Комментарии:
1. Почему в 2012 году невозможно получить точное время из Windows. Я регистрирую данные со временем ms, чтобы я мог видеть, сколько времени требуется для запуска. Мне нужно посмотреть, занимают ли некоторые вещи 2 мс против 7 мс, чтобы я мог выполнить настройку, но в Windows это совершенно невозможно. Кто-нибудь еще думает, что это безумие? (Я любитель unix, и у меня никогда раньше не было этой проблемы.)
2. @stu: Проще говоря, вы не должны использовать настенные часы в качестве секундомера. Настенные часы предназначены для хорошего представления текущего времени; они не предназначены для измерения небольших различий во времени. Это именно то, для чего nanoTime.
Ответ №2:
ДА. javadoc для System.currentTimeMillis()
этого говорит:
Возвращает текущее время в миллисекундах. Обратите внимание, что, хотя единицей времени возвращаемого значения является миллисекунда, степень детализации значения зависит от базовой операционной системы и может быть больше. Например, многие операционные системы измеряют время в единицах измерения в десятки миллисекунд.
Вы могли бы использовать System.nanoTime()
, но обязательно прочитайте его javadoc, чтобы понять его ограничения.
Ответ №3:
Невозможно получить более точную информацию с помощью java в Windows.