util nueva manejo localdatetime horas fechas ejemplo crear conociendo java java-8 java-time

manejo - ¿Por qué la nueva API Java 8 Date Time no tiene precisión de nanosegundos?



manejo de horas en java (2)

La API java.time en general tiene una precisión de nanosegundos. Por ejemplo:

DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd''T''HH:mm:ss,nnnnnnnnnZ"); OffsetDateTime odt = OffsetDateTime.of(2015, 11, 2, 12, 38, 0, 123456789, ZoneOffset.UTC); System.out.println(odt.format(formatter));

Salida:

2015-11-02T12:38:00,123456789+0000

Sin embargo, es el valor de reloj devuelto por OffsetDateTime.now() que devuelve un valor que solo tiene milisegundos.

Desde la implementación del Clock en Java 8:

La implementación del reloj proporcionada aquí se basa en System.currentTimeMillis() . Ese método proporciona poca o ninguna garantía sobre la precisión del reloj. Las aplicaciones que requieren un reloj más preciso deben implementar esta clase abstracta utilizando un reloj externo diferente, como un servidor NTP.

Por lo tanto, no hay nada inherentemente impreciso aquí: solo la implementación predeterminada de Clock usando System.currentTimeMillis() . Potencialmente podría crear su propia subclase más precisa. Sin embargo, debe tener en cuenta que agregar más precisión sin agregar más precisión probablemente no sea terriblemente útil. (Hay momentos en que podría ser, ciertamente ...)

Esta pregunta ya tiene una respuesta aquí:

Se supone que una de las características de la nueva API de fecha y hora en Java 8 es la precisión de nanosegundos. Sin embargo, cuando imprimo la fecha y hora actual en la consola así

DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyy-MM-dd''T''HH:mm:ss,nnnnnnnnnZ"); System.out.println(OffsetDateTime.now().format(formatter));

Solo veo precisión de milisegundos: 2015-11-02T12: 33: 26,746000000 + 0100

El sistema operativo parece admitir una precisión de nanosegundos. Cuando imprimo la fecha y hora actual a través de la Terminal

date -Ins

Veo 2015-11-02T12: 33: 26,746134417 + 0100

¿Cómo obtengo precisión de nanosegundos en Java? Estoy ejecutando Oracle Java 1.8.0_66 en Ubuntu 14.04 de 64 bits


Para hacer una adición importante a la respuesta de Jon Skeet, se supone que Java 9 entregará un reloj con mayor precisión : consulte el registro de errores . Antecedentes: en muchos sistemas operativos (especialmente Linux), hay mejores relojes disponibles.

La especificación Java SE 8 para java.time.Clock establece que "los métodos de fábrica del sistema proporcionan relojes basados ​​en los mejores disponibles
reloj del sistema. Esto puede usar System.currentTimeMillis (), o un reloj de mayor resolución si hay uno disponible. ". En JDK 8 la implementación
del reloj devuelto se basó en System.currentTimeMillis () y, por lo tanto, solo tiene una resolución de milisegundos. En JDK 9, la implementación
se basa en el reloj nativo subyacente que System.currentTimeMillis () está utilizando, proporcionando la resolución máxima disponible desde ese reloj. En la mayoría de los sistemas, esto puede ser de microsegundos o, a veces, incluso la décima parte de microsegundos.

Una aplicación que asume que el reloj devuelto por estos métodos de fábrica del sistema siempre tendrá una precisión de milisegundos y depende activamente de él, por lo tanto, debe actualizarse para tener en cuenta la posibilidad de una mayor resolución, como era
indicado en la documentación de la API.

También se debe tener en cuenta el hecho (exótico) de que la segunda precisión no existirá cerca de los segundos bisiestos, ni siquiera en Java 9.