158 votes

Comment convertir les nanosecondes en secondes en utilisant l'énumération TimeUnit ?

Comment convertir une valeur de nanosecondes en secondes?

Voici le segment de code:

import java.io.*;
import java.util.concurrent.*; 
..

class Stamper { 

public static void main (String[] args) { 
long start = System.nanoTime(); 
//essayez avec des boucles imbriquées 
long end = System.nanoTime(); 
long elapsedTime = end - start;

System.out.println("écoulé: " + elapsedTime + "nanosecondes\n");

//convertir en secondes 
TimeUnit seconds = new TimeUnit(); 
System.out.println("ce qui est " + seconds.toSeconds(elapsedTime) + " secondes"); 
}}

L'erreur est

Stamper.java:16:  les types enum ne peuvent pas être instanciés.

Que signifie cela?

5 votes

L'erreur signifie que vous ne pouvez pas instancier le type TimeUtil, car c'est un enum (énumérateur). Si vous voulez utiliser TimeUnit, vous devriez utiliser TimeUnit.NANOSECONDS.toSeconds(elapsedTime) à la place. Bonne chance!

368voto

pythonquick Points 4314

Énumération TimeUnit

L'expression suivante utilise l' enum TimeUnit (Java 5 et ultérieur) pour convertir des nanosecondes en secondes :

TimeUnit.SECONDS.convert(tempsÉcoulé, TimeUnit.NANOSECONDS)

15 votes

Il est à noter que cette méthode n'inclut pas les fractions de seconde. Ainsi, 4.9999999 serait simplement 4 secondes.

1 votes

Cela est préféré car vous ne devriez jamais écrire 1 suivi d'un tas de 0 à cause de la propension aux erreurs.

1 votes

Vous pouvez l'écrire comme suit elapsedTime = (end_time - start_time)/1e9;

212voto

Adam Rosenfield Points 176408

Eh bien, vous pourriez simplement diviser par 1 000 000 000 :

long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;

Si vous utilisez TimeUnit pour convertir, vous obtiendrez votre résultat en tant que long, donc vous perdrez la précision décimale mais maintiendrez la précision des nombres entiers.

0 votes

Je changerais rendre 1000000000 un double pour forcer la division à double précision.

2 votes

1000000000,0 est déjà un double; une constante de type float serait 1000000000,0f.

82 votes

Mais que se passe-t-il si le nombre de nanosecondes dans une seconde change? :P

61voto

Nick Veys Points 8638

TimeUnit est un enum, donc vous ne pouvez pas en créer un nouveau.

Le suivant convertira 1000000000000ns en secondes.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4 votes

Je crois que c'est 10e+9 et non pas 1e+12!

8 votes

Ceci est une réponse assez tardive, mais le nombre dans l'exemple n'est pas le nombre de nanos dans une seconde, c'est juste un nombre à convertir. L'idée principale est de ne pas avoir à connaître ces valeurs.

2 votes

Je pense que cela devrait être la réponse acceptée. Utiliser toXxx() est préférable à utiliser convert() car avec convert() il n'est pas évident dans quelle direction se fait la conversion, alors qu'avec toXxx() si.

22voto

Zoltán Points 2915

Pour réduire la verbosité, vous pouvez utiliser un import statique :

import static java.util.concurrent.TimeUnit.NANOSECONDS;

-et désormais tapez simplement

NANOSECONDS.toSeconds(tempsÉcoulé);

7voto

Vous devriez écrire :

    long startTime = System.nanoTime();        
    long estimatedTime = System.nanoTime() - startTime;

Assigner la fin du temps écoulé dans une variable peut causer quelques nanosecondes. Avec cette approche, vous obtiendrez le temps écoulé exact.

Et ensuite :

TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X