Если я правильно понимаю, использование System.nanoTime()
– более точный способ сохранения маркера в текущее время, чем System.currentTimeInMillis()
, даже если системное время было изменено. Так почему же, когда я конвертирую длинное значение nanoTime()
в объект Calendar
, результат неправильный?
import java.util.Calendar; public class Test { public static void main(String[] args) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(System.currentTimeMillis()); System.out.println(c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE) + " " + c.get(Calendar.YEAR) + " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) + ":" + c.get(Calendar.MILLISECOND)); } }
System.nanotime () javadoc предлагает:
Возвращает текущее значение наиболее точного доступного системного таймера в наносекундах.
Этот метод можно использовать только для измерения прошедшего времени и не имеет отношения к какому-либо другому понятию системного или настенного времени. Возвращаемое значение представляет собой наносекунды с некоторого фиксированного, но произвольного времени (возможно, в будущем, поэтому значения могут быть отрицательными). Этот метод обеспечивает наносекундную точность, но не обязательно наносекундную точность. Нет никаких гарантий относительно того, как часто меняются значения. Различия в последовательных вызовах, которые охватывают более 292 лет (263 наносекунды), не будут точно вычислять прошедшее время из-за численного переполнения.
Например, чтобы определить, сколько времени потребуется выполнить код:
long startTime = System.nanoTime(); // ... the code being measured ... long estimatedTime = System.nanoTime() - startTime;