Как преобразовать наносекунды в секунды с помощью перечисления TimeUnit?
Как преобразовать значение от наносекунд к секундам?
Здесь сегмент кода:
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.
Что это значит?
Ответы
Ответ 1
Хорошо, вы могли бы просто делить на 1 000 000 000:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1000000000.0;
Если вы используете TimeUnit
для преобразования, вы получите результат как длинный, так что вы потеряете десятичную точность, но сохраните точность целых чисел.
Ответ 2
TimeUnit
Enum
В следующем выражении используется TimeUnit
enum (Java 5 и более поздние версии) для преобразования от наносекунд к секундам:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
Ответ 3
TimeUnit - это перечисление, поэтому вы не можете создать новый.
Следующее преобразует 1000000000000nsns в секунды.
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Ответ 4
Чтобы уменьшить многословие, вы можете использовать статический импорт:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
- и впредь просто наберите
NANOSECONDS.toSeconds(elapsedTime);
Ответ 5
Вы должны написать:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
Назначение endTime в переменной может вызвать несколько наносекунд. При таком подходе вы получите точное время.
И затем:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Ответ 6
Это преобразует время в секундах в двойном формате, что более точно, чем целочисленное значение:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;