tl; dr
Java 9 y posterior: resolución de hasta nanosegundos al capturar el momento actual. Eso es 9 dígitos de fracción decimal.
Instant.now()
2017-12-23T12: 34: 56.123456789Z
Para limitar a microsegundos , truncar .
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
En la práctica, verá solo microsegundos capturados con, .now
ya que los relojes de hardware de computadora convencionales contemporáneos no son precisos en nanosegundos .
Detalles
Las otras Respuestas están algo desactualizadas a partir de Java 8.
java.time
Java 8 y versiones posteriores vienen con el marco java.time . Estas nuevas clases suplantan las problemáticas y defectuosas clases de fecha y hora incluidas en las primeras versiones de Java, como java.util.Date/.Calendar y java.text.SimpleDateFormat. El marco está definido por JSR 310, inspirado en Joda-Time , ampliado por el proyecto ThreeTen-Extra.
Las clases en java.time se resuelven en nanosegundos , mucho más fino que los milisegundos utilizados por las antiguas clases de fecha y hora y por Joda-Time. Y más fino que los microsegundos que se preguntan en la Pregunta.
Clock
Implementación
Si bien las clases java.time admiten datos que representan valores en nanosegundos, las clases aún no generan valores en nanosegundos. Los now()
métodos utilizan la misma aplicación de reloj antiguo como las clases de fecha y hora de edad, System.currentTimeMillis()
. Tenemos la nueva Clock
interfaz en java.time, pero la implementación de esa interfaz es el mismo reloj de milisegundos.
Por lo tanto, podría formatear la representación textual del resultado de ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
para ver nueve dígitos de una fracción de segundo, pero solo los primeros tres dígitos tendrán números como este:
2017-12-23T12:34:56.789000000Z
Nuevo reloj en Java 9
Las implementaciones OpenJDK y Oracle de Java 9 tienen una nueva Clock
implementación predeterminada con una granularidad más fina, hasta la capacidad completa de nanosegundos de las clases java.time.
Consulte el problema de OpenJDK, Aumente la precisión de la implementación de java.time.Clock.systemUTC () . Ese problema se ha implementado con éxito.
2017-12-23T12:34:56.123456789Z
En una MacBook Pro (Retina, 15 pulgadas, finales de 2013) con macOS Sierra, obtengo el momento actual en microsegundos (hasta seis dígitos de fracción decimal).
2017-12-23T12:34:56.123456Z
Reloj de hardware
Recuerde que incluso con una nueva Clock
implementación más fina , sus resultados pueden variar según la computadora. Java depende del reloj del hardware de la computadora subyacente para conocer el momento actual.
- La resolución de los relojes de hardware varía ampliamente. Por ejemplo, si el reloj de hardware de una computadora en particular solo admite microsegundos granularidad de , cualquier valor de fecha y hora generado tendrá solo seis dígitos de una fracción de segundo y los últimos tres dígitos serán ceros.
- La precisión de los relojes de hardware varía ampliamente. Solo porque un reloj genera un valor con varios dígitos de fracción decimal de un segundo, esos dígitos pueden ser inexactos, solo aproximaciones, a la deriva del tiempo real como se podría leer en un reloj atómico . En otras palabras, el hecho de que vea un montón de dígitos a la derecha de la marca decimal no significa que pueda confiar en que el tiempo transcurrido entre tales lecturas sea fiel a ese minuto.