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?
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
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 eltoFoo()
todos los métodos regresanlong
nieve 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á0
no0.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
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)
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;
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–
El error significa que no puede instanciar el tipo
TimeUtil
porque es unenum
(enumerador). Si quieres usarTimeUnit
Deberías usarTimeUnit.NANOSECONDS.toSeconds(elapsedTime)
en cambio. ¡Buena suerte!– Daniel Kvist
21 de marzo de 2015 a las 22:02