Как преобразовать наносекунды в секунды, используя перечисление TimeUnit? - PullRequest
136 голосов
/ 29 мая 2009

Как преобразовать значение из наносекунд в секунды?

Вот сегмент кода:

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"); 
}}

Ошибка

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

Что это значит?

Ответы [ 6 ]

343 голосов
/ 29 мая 2009

TimeUnit Перечисление

Следующее выражение использует перечисление TimeUnit (Java 5 и более поздние) для преобразования из наносекунд в секунды:

TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
192 голосов
/ 29 мая 2009

Ну, вы можете просто разделить на 1 000 000 000:

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

Если вы используете TimeUnit для преобразования, вы получите длинный результат, так что вы потеряете десятичную точность, но сохраните точность целых чисел.

56 голосов
/ 29 мая 2009

TimeUnit - это перечисление, поэтому вы не можете создать новый.

Следующее преобразует 1000000000000ns в секунды.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
21 голосов
/ 24 мая 2013

Чтобы уменьшить детализацию, вы можете использовать статический импорт:

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

- и впредь просто наберите

NANOSECONDS.toSeconds(elapsedTime);
6 голосов
/ 08 октября 2013

Вы должны написать:

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

Назначение endTime в переменной может вызвать несколько наносекунд. При таком подходе вы получите точное истекшее время.

А потом:

TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
4 голосов
/ 26 октября 2015

Это преобразует время в секунды в двойном формате, который является более точным, чем целочисленное значение:

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