如何使用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(枚举数)。如果要使用TimeUnit,则应TimeUnit.NANOSECONDS.toSeconds(elapsedTime)改用。祝好运!
Daniel Kvist

Answers:


200

好吧,您可以除以1,000,000,000:

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

如果使用TimeUnit转换,结果将很长,因此将失去小数精度,但保持整数精度。


78
但是,如果每秒的纳秒数发生变化怎么办?:P
geofftnz

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

3
如果需要几分之一秒,请在TimeUnit Enum方法上使用此方法。使用TimeUnit枚举甚至不会舍入到最接近的秒数,它实际上只是将一秒的分数砍掉。所以4.9999999,只会是4
迪克·卢卡斯

354

TimeUnit 枚举

以下表达式使用TimeUnit枚举(Java 5和更高版本)将纳秒转换为秒:

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

14
并不是说这种方法不包括几分之一秒。因此4.9999999,仅需4秒。
迪克·卢卡斯

1
这是首选方法,因为您绝不应该写出1,然后再写0,因为它很容易出错。
demongolem '16

1
您可以这样写:经过时间=(end_time-start_time)/ 1e9;
哈森

1
如果我停留59分50秒,它仍然显示经过了0小时...这并不理想。那么有什么方法可以使这种方法与分数一起使用?
user1156544

58

TimeUnit是一个枚举,因此您无法创建一个新的枚举。

以下将把1000000000000ns转换为秒。

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
我相信是10e + 9而不是1e + 12!
亚当·阿罗德

8
这是一个很晚的答复,但是示例中的数字不是一秒钟内的纳秒数,而是要转换的数字。整个想法是不必知道那些值。
Nick Veys 2014年

2
我认为这应该是公认的答案。使用toXxx()比使用convert()更可取,因为使用convert()时,转换发生的方向不明显,而使用toXxx()时,转换是正确的。
Klitos Kyriacou 2015年

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;

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.