¿Cómo convertir nanosegundos a segundos usando la enumeración TimeUnit?

4 minutos de lectura

avatar de usuario
colina

¿Cómo convertir un valor de nanosegundos a segundos?

Aquí está el segmento de código:

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

class Stamper { 

public static void main (String[] args) { 
long start = System.nanoTime(); 
//some try with nested loops 
long end = System.nanoTime(); 
long elapsedTime = end - start;

System.out.println("elapsed: " + elapsedTime + "nano seconds\n");

//convert to seconds 
TimeUnit seconds = new TimeUnit(); 
System.out.println("which is " + seconds.toSeconds(elapsedTime) + " seconds"); 
}}

el error es

Stamper.java:16:  enum types may not be instantiated.

¿Qué significa esto?

  • El error significa que no puede instanciar el tipo TimeUtilporque es un enum (enumerador). Si quieres usar TimeUnitDeberías usar TimeUnit.NANOSECONDS.toSeconds(elapsedTime) en cambio. ¡Buena suerte!

    – Daniel Kvist

    21 de marzo de 2015 a las 22:02


avatar de usuario
pythonquick

TimeUnit enumeración

La siguiente expresión utiliza la TimeUnit enum (Java 5 y posterior) para convertir de nanosegundos a segundos:

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

  • No es que este método no incluya fracciones de segundo. Entonces 4.9999999, serían simplemente 4 segundos.

    – Dick Lucas

    30 de enero de 2015 a las 20:21

  • Esto es preferible porque nunca debe escribir 1 seguido de un montón de 0 debido a que es muy propenso a errores.

    – demongolem

    23 de febrero de 2016 a las 18:56

  • puedes escribirlo así ElapsedTime = (end_time – start_time)/1e9;

    – Hasson

    13/09/2016 a las 23:48


  • Si me quedo 59 minutos y 50 segundos todavía dice que transcurrieron 0h… Lo cual no es lo ideal. Entonces, ¿hay alguna manera de hacer que este método funcione con fracciones?

    – usuario1156544

    28 de febrero de 2017 a las 13:47

avatar de usuario
adam rosenfield

Bueno, podrías dividir por 1,000,000,000:

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

Si utiliza TimeUnit para convertir, obtendrá su resultado como largo, por lo que perderá la precisión decimal pero mantendrá la precisión de números enteros.

  • Pero, ¿y si cambia el número de nanosegundos en un segundo? :PAGS

    – geofftnz

    29 de mayo de 2009 a las 3:17

  • Esta respuesta ahora es incorrecta: convert() y el toFoo() todos los métodos regresan longnieve docs.oracle.com/javase/6/docs/api/java/util/concurrent/…

    – Riking

    30 de julio de 2013 a las 1:58


  • @mbarrows Sin embargo, esta respuesta sigue siendo Correcto en eso el TimeUnit solución da como resultado una pérdida de especificidad. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS); regresará 0no 0.5. Simplemente depende de su caso de uso cuál de estos es preferible.

    – nbrooks

    07/08/2014 a las 20:42

  • Completamente de acuerdo con @nbrooks aquí. El uso de TimeUnit no generará fracciones de segundo, sino que devolverá 0. Si no desea usar un número de 10 dígitos codificado, use algo como 1E9. Por ejemplo : double seconds = ((double) nanoseconds) / 1E9; Haría esto cada vez como una preferencia personal.

    – Viaje tecnológico

    14 de agosto de 2014 a las 3:48


  • Use este método sobre el método TimeUnit Enum si desea fracciones de segundo. El uso de TimeUnit Enum ni siquiera redondea al segundo más cercano, esencialmente solo corta las fracciones de segundo. Entonces 4.9999999, sería simplemente 4.

    – Dick Lucas

    30/01/2015 a las 20:20

avatar de usuario
nick veys

TimeUnit es una enumeración, por lo que no puede crear una nueva.

Lo siguiente convertirá 1000000000000ns a segundos.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

  • ¡Creo que es 10e+9 no 1e+12!

    – Adán Arold

    27 de agosto de 2012 a las 19:06

  • Esta es una respuesta bastante tardía, pero el número en el ejemplo no es el número de nanos en un segundo, es solo un número para convertir. La idea es no tener que conocer esos valores.

    – Nick Veys

    12/03/2014 a las 18:31

  • Creo que esta debería ser la respuesta aceptada. Usar toXxx() es preferible a usar convert() porque con convert() no es obvio en qué dirección ocurre la conversión, mientras que con toXxx() sí lo es.

    – Klitos Kyriacou

    21 de diciembre de 2015 a las 12:27


Para reducir la verbosidad, puede usar una importación estática:

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

-y de ahora en adelante solo escriba

NANOSECONDS.toSeconds(elapsedTime);

Deberías escribir :

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

Asignar endTime en una variable puede causar algunos nanosegundos. En este enfoque obtendrá el tiempo transcurrido exacto.

Y entonces:

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

avatar de usuario
Ayaz Alifov

Esto convertirá un tiempo a segundos en un formato doble, que es más preciso que un valor entero:

double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;

avatar de usuario
Vova Perebykivskyi

JDK9+ solución usando java.tiempo.Duración

Duration.ofNanos(1_000_000L).toSeconds()

https://docs.oracle.com/javase/9/docs/api/java/time/Duration.html#ofNanos-long-

https://docs.oracle.com/javase/9/docs/api/java/time/Duration.html#toSeconds–

¿Ha sido útil esta solución?