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

StackOverflow https://stackoverflow.com/questions/924208

  •  06-09-2019
  •  | 
  •  

Вопрос

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

Вот фрагмент кода:

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 000 000 000:

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

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

Другие советы

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

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

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

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

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

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

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

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

-и впредь просто печатайте

NANOSECONDS.toSeconds(elapsedTime);

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

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

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

А потом:

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

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

double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top