Java.time.Instant de Java 8 stocke en "résolution nanoseconde", mais l'utilisation d'Instant.now () ne fournit qu'une résolution en millisecondes ...
Instant instant = Instant.now();
System.out.println(instant);
System.out.println(instant.getNano());
Résultat...
2013-12-19T18:22:39.639Z
639000000
Comment puis-je obtenir un instant dont la valeur est "maintenant", mais avec une résolution en nanosecondes?
Bien que l'horloge Java8 par défaut ne fournisse pas de résolution en nanosecondes, vous pouvez la combiner avec Java possibilité de mesurer différences de temps avec une résolution en nanosecondes, créant ainsi une horloge capable de nanosecondes réelle.
public class NanoClock extends Clock
{
private final Clock clock;
private final long initialNanos;
private final Instant initialInstant;
public NanoClock()
{
this(Clock.systemUTC());
}
public NanoClock(final Clock clock)
{
this.clock = clock;
initialInstant = clock.instant();
initialNanos = getSystemNanos();
}
@Override
public ZoneId getZone()
{
return clock.getZone();
}
@Override
public Instant instant()
{
return initialInstant.plusNanos(getSystemNanos() - initialNanos);
}
@Override
public Clock withZone(final ZoneId zone)
{
return new NanoClock(clock.withZone(zone));
}
private long getSystemNanos()
{
return System.nanoTime();
}
}
Son utilisation est simple: il suffit de fournir un paramètre supplémentaire à Instant.now (), ou d'appeler directement Clock.instant ():
final Clock clock = new NanoClock();
final Instant instant = Instant.now(clock);
System.out.println(instant);
System.out.println(instant.getNano());
Bien que cette solution puisse fonctionner même si vous recréez des instances NanoClock à chaque fois, il est toujours préférable de s'en tenir à une horloge stockée initialisée au début de votre code, puis utilisée partout où cela est nécessaire.
Vous pouvez vous considérer chanceux si vous obtenez même une résolution en millisecondes.
Instant
mai modèle le temps à la précision en nanosecondes, mais l'équipement réel sur votre ordinateur qui suit le temps de l'horloge murale a généralement une résolution d'environ 10 ms et une précision presque certainement un peu en dessous (100 ms serait une hypothèse optimiste).
Comparez cela avec System.nanoTime()
, qui donne la résolution en microsecondes, mais ne donne pas de temps d'horloge murale absolu. De toute évidence, il y a déjà un compromis à faire pour vous donner ce type de résolution, toujours trois ordres de grandeur en deçà des nanosecondes.
Vous ne pouvez obtenir un instantané avec des "nanosecondes" qu'en utilisant un autre Java.time.Clock plus précis en utilisant la méthode Instant public static Instant now(Clock clock)
Dans votre exemple, l'horloge par défaut utilise normalement System.currentTimeMillis () qui ne peut afficher aucun nanosecondes.
Sachez qu'aucune horloge n'est disponible en résolution nanoseconde (temps réel). La fonction de représentation interne en nanosecondes de Java.time.Instant est principalement due à l'exigence de cartographier les horodatages de la base de données donnés en précision en nanosecondes (mais normalement pas précis en nanosecondes!).
Mise à jour du 29/12/2015: Java-9 offrira une meilleure horloge, voir mon nouveau post .
J'ai donc passé du temps à fouiller dans le Javadoc ici:
http://download.Java.net/jdk8/docs/api/Java/time/Instant.html
Il semble que vous devriez pouvoir effectuer les opérations suivantes:
Instant inst = Instant.now();
long time = inst.getEpochSecond();
time *= 1000000000l; //convert to nanoseconds
time += inst.getNano(); //the nanoseconds returned by inst.getNano() are the nanoseconds past the second so they need to be added to the Epoch second
Cela dit - les autres répondants font valoir qu'il sera très difficile d'obtenir une nano-seconde précise car les ordinateurs n'ont généralement pas la capacité de suivre le temps jusqu'à cette résolution.