TimeUnit 열거 형을 사용하여 나노초를 초로 변환하는 방법은 무엇입니까?


145

나노초에서 초로 값을 변환하는 방법은 무엇입니까?

코드 세그먼트는 다음과 같습니다.

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.

이것은 무엇을 의미 하는가?


4
이 오류는 type TimeUtilenum열거 자 이므로 인스턴스화 할 수 없음을 의미합니다 . 을 사용 TimeUnit하려면 TimeUnit.NANOSECONDS.toSeconds(elapsedTime)대신 사용해야 합니다. 행운을 빕니다!
Daniel Kvist

답변:


200

글쎄, 당신은 1,000,000,000으로 나눌 수 있습니다 :

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

TimeUnit변환 하는 데 사용 하면 결과가 길어 지므로 소수점 정밀도는 잃지 만 정수 정밀도는 유지됩니다.


78
그러나 1 초 안에 나노초의 수가 바뀌면 어떻게 될까요? : P
geofftnz

9
이 답변은 현재 잘못 - convert()toFoo()방법은 모든 반환은 long이제 s의 docs.oracle.com/javase/6/docs/api/java/util/concurrent/...
Riking

3
@mbarrows 그러나이 답변은 솔루션 이 특이성을 잃는다는 점에서 여전히 습니다 TimeUnit. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);반환 0하지 0.5. 단순히 사용 사례에 따라 달라집니다.
nbrooks

17
@nbrooks에 동의합니다. TimeUnit을 사용하면 초 단위로 출력하지 않고 대신 0을 반환합니다. 하드 코딩 된 10 자리 숫자를 사용하지 않으려면 1E9와 같은 것을 사용하십시오. 예를 들어 : double seconds = ((double) nanoseconds) / 1E9; 나는 개인적 선호로 매번 이것을 할 것입니다.
TechTrip

3
몇 분의 1 초를 원하면 TimeUnit Enum 방법보다이 방법을 사용하십시오. TimeUnit Enum을 사용하면 가장 가까운 초 단위로 반올림되지 않고 본질적으로 1 분의 1 초만 잘라냅니다. 따라서 4.9999999는 간단히 4입니다.
Dick Lucas

354

TimeUnit 열거 형

다음 표현식은 TimeUnit열거 형 (Java 5 이상)을 사용하여 나노초에서 초로 변환합니다.

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

14
이 방법에는 몇 초가 포함되지 않습니다. 따라서 4.9999999는 단순히 4 초입니다.
Dick Lucas

1
이것은 오류가 발생하기 쉽기 때문에 1 뒤에 0을 완전히 엉망으로 만들면 안되기 때문에 선호됩니다.
demongolem

1
다음과 같이 작성할 수 있습니다. elapsedTime = (end_time-start_time) / 1e9;
Hasson

1
59 분 50 초를 유지하면 여전히 0 시간이 경과했다고 표시됩니다. 이상적이지 않습니다. 그렇다면이 방법을 분수와 함께 사용할 수있는 방법이 있습니까?
user1156544

58

TimeUnit은 열거 형이므로 새 것을 만들 수 없습니다.

다음은 1000000000000ns를 초로 변환합니다.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
나는 그것이 1e + 12가 아니라 10e + 9라고 믿는다!
Adam Arold

8
이것은 꽤 늦은 답변이지만 예제의 숫자는 1 초 안에 나노의 수가 아니라 변환 할 숫자 일뿐입니다. 전체 아이디어는 그 가치를 알 필요가 없습니다.
Nick Veys

2
나는 이것이 받아 들여야 할 답변이라고 생각합니다. convert ()를 사용하는 경우 toXxx ()를 사용하는 것이 바람직하지만 convert ()를 사용하는 경우 toXxx ()를 사용하는 경우 방향이 명확하지 않기 때문입니다.
Klitos Kyriacou

21

자세한 정보를 줄이려면 정적 가져 오기를 사용하십시오.

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

-따라서 그냥 입력

NANOSECONDS.toSeconds(elapsedTime);

6

당신은 작성해야합니다 :

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

변수에 endTime을 지정하면 몇 나노초가 발생할 수 있습니다. 이 방법에서는 정확한 경과 시간을 얻을 수 있습니다.

그리고:

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

4

이것은 정수 값보다 더 정확한 이중 형식으로 시간을 초로 변환합니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.