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.