tl; dr
Java 9 и новее: разрешение до наносекунд при захвате текущего момента. Это 9 цифр десятичной дроби.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Чтобы ограничиться микросекундами , усеките .
Instant // Represent a moment in UTC.
.now() // Capture the current moment. Returns a `Instant` object.
.truncatedTo( // Lop off the finer part of this moment.
ChronoUnit.MICROS // Granularity to which we are truncating.
) // Returns another `Instant` object rather than changing the original, per the immutable objects pattern.
2017-12-23T12: 34: 56.123456Z
На практике вы увидите только микросекунды, захваченные с помощью .now
современных обычных компьютерных аппаратных часов, неточности в наносекундах .
подробности
Другие ответы несколько устарели с Java 8.
java.time
Java 8 и более поздние версии поставляются с фреймворком java.time . Эти новые классы вытесняют ошибочные и проблемные классы времени и даты, поставляемые с самыми ранними версиями Java, такими как java.util.Date/.Calendar и java.text.SimpleDateFormat. Структура определяется JSR 310, вдохновленной Joda-Time , расширенной проектом ThreeTen-Extra.
Классы в java.time разрешаются в наносекунды , что намного меньше миллисекунд, используемых как старыми классами даты и времени, так и Joda-Time. И точнее микросекунд, заданных в Вопросе.
Clock
Реализация
Хотя классы java.time поддерживают данные, представляющие значения в наносекундах, классы еще не генерируют значения в наносекундах. Эти now()
методы используют ту же самую старую реализацию часов , как и старые классы даты и время, System.currentTimeMillis()
. У нас есть новый Clock
интерфейс в java.time, но реализация этого интерфейса - те же старые часы в миллисекундах.
Таким образом, вы можете отформатировать текстовое представление результата, ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
чтобы увидеть девять цифр дробной секунды, но только первые три цифры будут иметь такие числа:
2017-12-23T12:34:56.789000000Z
Новые часы в Java 9
Реализации Java 9 в OpenJDK и Oracle имеют новую Clock
реализацию по умолчанию с более высокой степенью детализации, вплоть до полной наносекундной возможности классов java.time.
См. Проблему OpenJDK, Повышение точности реализации java.time.Clock.systemUTC () . Эта проблема успешно реализована.
2017-12-23T12:34:56.123456789Z
На MacBook Pro (Retina, 15 дюймов, конец 2013 г.) с macOS Sierra я получаю текущий момент в микросекундах (до шести цифр десятичной дроби).
2017-12-23T12:34:56.123456Z
Аппаратные часы
Помните, что даже с новой более тонкой Clock
реализацией ваши результаты могут отличаться в зависимости от компьютера. Java зависит от часов базового компьютерного оборудования, чтобы узнать текущий момент.
- Разрешение аппаратных часов изменяться в широких пределах. Например, если аппаратные часы конкретного компьютера поддерживают детализацию только в микросекундах , любые сгенерированные значения даты и времени будут иметь только шесть цифр дробной секунды, причем последние три цифры будут нулями.
- Точность аппаратных часов изменяться в широких пределах. Просто потому, что часы генерируют значение с несколькими цифрами десятичной доли секунды, эти цифры могут быть неточными, просто приближениями, дрейфующими от фактического времени, которое может быть прочитано с атомных часов . Другими словами, только то, что вы видите группу цифр справа от десятичного знака, не означает, что вы можете доверять истекшему времени между такими показаниями, чтобы быть верным до этой минутной степени.