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 TimeUtil이 enum열거 자 이므로 인스턴스화 할 수 없음을 의미합니다 . 을 사용 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.