Saltar al contenido

Java 8 LocalDateTime.now () solo brinda precisión de milisegundos

Contamos con la mejor respuesta que hallamos por todo internet. Esperamos que te sirva de ayuda y si puedes comentarnos algo que nos pueda ayudar a crecer hazlo con libertad.

Solución:

tl; dr

¿Es posible obtener microsegundos en Java 8?

No. Utilice Java 9 o posterior.

Instant.now()  // Returns a value in microseconds in Java 9 and later, but is restricted to mere milliseconds in Java 8.

Esto se refiere a las implementaciones de Oracle y OpenJDK de Java 8/9. Otros pueden variar.

Java 9 y posterior

Java 9 tiene una nueva implementación de java.time.Clock capaz de capturar el momento actual con una resolución más fina que milisegundos (Tres dígitos de la fracción decimal).

La resolución real depende de los límites del reloj del hardware de su computadora host. En macOS Sierra con Oracle Java 9.0.4, obtengo el momento actual con microsegundos (seis dígitos de la fracción decimal).

Instant.now().toString()

2018-03-09T21: 03: 33.831515Z

Java 8

Las clases java.time eran nuevas en Java 8. Estas clases están definidas para transportar nanosegundos (nueve dígitos de la fracción decimal). Pero capturar el momento actual se limitó a solo milisegundos en Java 8 y se mejoró en Java 9 para capturar el momento actual en microsegundos más finos.

2018-03-09T21: 03: 33.831Z

Otros asuntos

System.currentTimeMillis()

Si obtengo System.currentTimeMillis () y System.nanoTime ()

No es necesario usar System.currentTimeMillis() Nunca más. En su lugar use java.time.Instant por un momento en UTC con una resolución tan fina como nanosegundos.

Si realmente necesita un recuento de milisegundos de la referencia de época de 1970-01-01T00: 00Z, pregunte al Instant objeto. Tenga en cuenta la pérdida de datos, ya que ignoraría cualquier microsegundo o nanosegundo presente en el Instant.

long millisSinceEpoch = instant.now().toEpochMilli() ;

¿Hay alguna forma de analizar la hora del reloj a partir de estos valores?

Sí, puede convertir un recuento de milisegundos desde la época de 1970-01-01T00: 00Z a un Instant.

Instant instant = Instant.ofEpochMilli( millisSinceEpoch ) ;

System.nanoTime()

Como para System.nanoTime(), que está destinado a realizar un seguimiento del tiempo transcurrido, como comparar el rendimiento de su código. Vocación System.nanoTime() lo hace no decirle algo sobre la fecha y hora actual.

Este valor es un recuento de nanosegundos desde algún punto de origen indocumentado en el tiempo. En la práctica, he visto que el número parece rastrear el tiempo desde que se lanzó la JVM, pero este comportamiento no está documentado, por lo que no debe confiar en él.

LocalDateTime es no un momento

Mi problema es que necesito registrar usando Java y Javascript y necesitan tener un campo de microsegundos consistente en ambos.

En primer lugar, para iniciar sesión debe no estar usando LocalDateTime clase. Esa clase carece deliberadamente de cualquier concepto de zona horaria o desplazamiento de UTC. Como tal, un LocalDateTime lo hace no representar un momento, es no un punto en la línea de tiempo. A LocalDateTime es una idea sobre potencial momentos a lo largo de un rango de aproximadamente 26-27 horas. Usar LocalDateTime solo si la zona / compensación es desconocida (no es una buena situación), o si esto representa algo como “El día de Navidad comienza el primer momento del 25 de diciembre de 2018”, donde la Navidad comienza en diferentes momentos para diferentes regiones del mundo, comenzando primero en el Lejano Oriente (Pacífico), y moviéndose hacia el oeste a medianoche después de la medianoche sucesiva.

Para el registro, debe utilizar UTC. En Java, esa sería la Instant clase, siempre en UTC por definición. Solo llama Instant.now().

Al serializar a texto, como para el registro, utilice siempre los formatos estándar ISO 8601. los java.time las clases usan estos formatos estándar por defecto al analizar / generar cadenas. Viste ejemplos arriba en esta respuesta.

Ver otra pregunta, ¿Cuál es la diferencia entre Instant y LocalDateTime?.

Tabla de tipos de fecha y hora en Java, tanto moderno como heredado

ISO 8601

En ISO 8601, la fracción decimal de un segundo puede tener cualquier número de dígitos. Por lo tanto, no debería importarle si el evento registrado se registró en milisegundos, microsegundos o nanosegundos.

Instant instant = Instant.parse( "2018-03-09T21:03:33.123456789Z" ) ;
Instant instant = Instant.parse( "2018-03-09T21:03:33.123456Z" ) ;
Instant instant = Instant.parse( "2018-03-09T21:03:33.123Z" ) ;

Truncar

Si tu De Verdad cree que necesita una resolución uniforme, puede truncar un Instant.

Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ; // Strip away any microseconds or nanoseconds.

No te preocupes por la resolución

Mi problema es que necesito hacer un registro usando Java y Javascript y necesitan tener un campo de microsegundos consistente en ambos.

En primer lugar, dudo que realmente tengas que preocuparte por esto. Si utiliza el formato estándar ISO 8601 y el Instant class en Java, puede serializar y rehidratar un momento con éxito en milis, micros o nanos.

Y las cadenas con formato ISO 8601 se ordenarán alfabéticamente de manera conveniente cronológicamente incluso si varía la resolución de una fracción de segundo.

En segundo lugar, si por alguna razón intenta realizar un seguimiento de los momentos reales en microsegundos, es probable que se sienta decepcionado. A partir de 2018, los relojes de computadora convencionales no son confiables en el rango de microsegundos.


Sobre java.time

los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan a las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a las clases java.time.

Para obtener más información, consulte el Tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, y después
    • Incorporado.
    • Parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time está retroportada a Java 6 y 7 en ThreeTen-Backport.
  • Androide
    • Versiones posteriores de implementaciones de paquetes de Android de las clases java.time.
    • Para Android anterior (<26), el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

los ThreeTen-Extra el proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.

los LocalDate.now() se basa en el SystemClock::instant() método, que utiliza System.currentTimeMillis(), por lo que no obtendrá una resolución más precisa con el reloj predeterminado.

Sin embargo, puede implementar su propia alta precisión Clock y usar eso junto con LocalDate:

LocalDate hpDate = LocalDate.now(microsecondClock);

Para una alta precisión, puede utilizar el TickClock con tics de microsegundos:

Clock microsecondClock = Clock.tick(Clock.systemUTC(), Duration.ofNanos(1000));

o subclase Clock e implemente su propio reloj de alta precisión, es decir, usando System.currentTimemillis () y System.nanoTime ().

Si bien su computadora puede informar algo más preciso (pero probablemente no exacto, al menos no en tiempo de pared) que milisegundos, esto no cambia el hecho de que Java por defecto usa un Clock basado en System.currentTimeMillis().

Debes proporcionar una información más precisa Clock para obtener valores más precisos que ms. Es decir, hasta Java 9.

Si te animas, puedes dejar un artículo acerca de qué te ha parecido este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *