Sur un système Unix, existe-t-il un moyen d’obtenir un horodatage avec une précision de niveau microseconde en Java? Quelque chose comme C gettimeofday
fonction.
Réponses
Trop de publicités?Non, Java n'a pas cette capacité.
Il possède System.nanoTime (), mais cela ne fait que compenser l’heure connue. Ainsi, même si vous ne pouvez pas en prendre le nombre absolu, vous pouvez l’utiliser pour mesurer une précision à la nanoseconde (ou supérieure).
Notez que le JavaDoc indique que si cela fournit une précision nanoseconde, cela ne signifie pas une précision nanoseconde. Prenez donc un module suffisamment grand de la valeur de retour.
Vous pouvez utiliser System.nanoTime()
:
long start = System.nanoTime();
// do stuff
long end = System.nanoTime();
long microseconds = (end - start) / 1000;
obtenir le temps en nanosecondes mais c'est une mesure strictement relative. Cela n'a pas de sens absolu. Ce n'est utile que si vous comparez à d'autres nanotechnologies pour mesurer le temps qu'il faut à quelque chose.
Comme d'autres affiches déjà indiqué; l'horloge de votre système est probablement pas synchronisée jusqu'à microsecondes pour le monde réel le temps. Néanmoins microseconde précision les horodatages utile comme un hybride à la fois indiquant mur en cours de temps, et de mesure/de profilage de la durée des choses.
Je l'étiquette de tous les événements, les messages écrits dans un journal de fichiers à l'aide des horodateurs, comme "2012-10-21 19:13:45.267128". Ces véhiculent à la fois quand il est arrivé (le"mur" de temps), et peut également être utilisé pour mesurer la durée entre le présent et l'événement suivant dans le fichier journal (différence relative en microsecondes).
Pour y parvenir, vous avez besoin de lien Système.currentTimeMillis() avec le Système.nanoTime() et de travailler exclusivement avec le Système.nanoTime() à partir de ce moment-là. Exemple de code:
/**
* Class to generate timestamps with microsecond precision
* For example: MicroTimestamp.INSTANCE.get() = "2012-10-21 19:13:45.267128"
*/
public enum MicroTimestamp
{ INSTANCE ;
private long startDate ;
private long startNanoseconds ;
private SimpleDateFormat dateFormat ;
private MicroTimestamp()
{ this.startDate = System.currentTimeMillis() ;
this.startNanoseconds = System.nanoTime() ;
this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
}
public String get()
{ long microSeconds = (System.nanoTime() - this.startNanoseconds) / 1000 ;
long date = this.startDate + (microSeconds/1000) ;
return this.dateFormat.format(date) + String.format("%03d", microSeconds % 1000) ;
}
}