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
エラーは、タイプ(列挙子)でTimeUtilあるため、タイプをインスタンス化できないことを意味しますenum。を使用したい場合はTimeUnitTimeUnit.NANOSECONDS.toSeconds(elapsedTime)代わりに使用してください。幸運を!
Daniel Kvist 2015年

回答:


200

さて、1,000,000,000で割ることができます。

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

を使用TimeUnitして変換すると、結果はlong型になるため、小数精度は失われますが、整数精度は維持されます。


78
しかし、1秒のナノ秒数が変わったらどうなるでしょうか。:P
geofftnz 2009年

9
この答えは、今間違っている- convert()toFoo()の方法は、すべてのリターンlongの今docs.oracle.com/javase/6/docs/api/java/util/concurrent/...
Riking

3
@mbarrowsしかし、この答えは、ソリューションが特異性の喪失をもたらすという点で正しいTimeUnitです。TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);戻り0ません0.5。どちらが望ましいかは、ユースケースによって異なります。
nbrooks 2014

17
ここで@nbrooksに完全に同意してください。TimeUnitを使用すると、秒の小数部が出力されず、代わりに0が返されます。ハードコードされた10桁の数字を使用しない場合は、1E9などを使用します。たとえば:double seconds = ((double) nanoseconds) / 1E9; 個人的な好みとして毎回これを行います。
TechTrip 2014

3
秒の端数が必要な場合は、このメソッドをTimeUnit Enumメソッドに対して使用します。TimeUnit Enumを使用しても、最も近い秒に丸められることはなく、基本的には秒の端数が切り捨てられるだけです。4.9999999だから、単に4.だろう
ディック・ルーカス

354

TimeUnit 列挙型

次の式は、TimeUnit列挙型(Java 5以降)を使用してナノ秒から秒に変換します。

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

14
この方法には、秒の端数は含まれていません。したがって、4.9999999は単に4秒になります。
ディックルーカス

1
非常にエラーが発生しやすいため、1の後に0の全体の混乱が続くことは決してないため、これが推奨されます。
デーモンゴレム2016

1
次のように書くことができますexpededTime =(end_time-start_time)/ 1e9;
Hasson 2016

1
59分50秒滞在しても、0時間経過と表示されます...これは理想的ではありません。それで、このメソッドを分数で機能させる方法はありますか?
user1156544 2017

58

TimeUnitは列挙型なので、新しいものを作成することはできません。

以下は、1000000000000nsを秒に変換します。

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
1e + 12ではなく10e + 9だと思います!
アダムArold

8
これはかなり遅い回答ですが、この例の数値は1秒あたりのナノの数ではなく、変換する数値にすぎません。全体のアイデアは、それらの値を知る必要がないことです。
Nick Veys 14年

2
これは受け入れられる答えだと思います。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.