如何使用TimeUnit枚举将纳秒转换为秒?

phi*_*ill 141 java timeunit

如何将值从纳秒转换为秒?

这是代码段:

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"); 
}}
Run Code Online (Sandbox Code Playgroud)

错误是

Stamper.java:16:  enum types may not be instantiated.
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

pyt*_*ick 349

TimeUnit 枚举

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

TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
Run Code Online (Sandbox Code Playgroud)

  • 并不是说这种方法不包括一秒的分数.所以4.9999999,简直就是4秒. (13认同)

Ada*_*eld 195

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

long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
Run Code Online (Sandbox Code Playgroud)

如果你使用TimeUnit转换,你会得到你的结果很长,所以你将失去小数精度,但保持整数精度.

  • 但是,如果一秒内的纳秒数变化怎么办?:P (75认同)
  • 在这里完全赞同@nbrooks.使用TimeUnit不会输出一秒的分数,而是返回0.如果您不想使用硬编码的10位数字,则使用类似1E9的内容.例如:`double seconds =((double)nanoseconds)/ 1E9;`我每次都会这样做,作为个人喜好. (17认同)
  • 这个答案现在错了 - `convert()`和`toFoo()`方法都返回`long`s now http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ TimeUnit.html (9认同)
  • 对于那些不知道的人,`geofftnz`和`Riking`只是在开玩笑.. (8认同)
  • @mbarrows但是这个答案仍然是正确的,因为`TimeUnit`解决方案会导致特异性丢失.`TimeUnit.SECONDS.convert(500,TimeUnit.MILLISECONDS);`将返回`0`,而不是'0.5`.它只取决于您的用例,哪些更可取. (3认同)
  • 如果您想要几分之一秒,请在TimeUnit Enum方法上使用此方法.使用TimeUnit Enum甚至没有舍入到最接近的秒,它基本上只是缩短了一秒的分数.所以4.9999999,简直就是4. (3认同)
  • 1000000000.0已经是双倍的; 浮点常量为1000000000.0f. (2认同)
  • Riking不是在开玩笑,这个答案现在是错误的,因为TimeUnit方法返回longs(不是整数); 代码示例仍然有效,但是不好的做法(硬编码的10位数字很容易搞砸或改变而没有注意到).下面的pythonquick的答案是首选表达式. (2认同)
  • 不推荐使用@MarkKCowan静态配置文件,应该调用TimeConversion微服务. (2认同)

Nic*_*eys 57

TimeUnit是枚举,因此您无法创建新的.

以下将1000000000000ns转换为秒.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常晚的回复,但示例中的数字不是一秒钟内的nanos数量,它只是一个转换数字.整个想法是不必了解这些价值观. (8认同)
  • 我相信它是10e + 9而不是1e + 12! (4认同)
  • 我认为这应该是公认的答案.使用toXxx()比使用convert()更好,因为使用convert()时,转换发生的方向并不明显,而使用toXxx()则是. (2认同)

Zol*_*tán 21

要减少详细程度,可以使用静态导入:

import static java.util.concurrent.TimeUnit.NANOSECONDS;
Run Code Online (Sandbox Code Playgroud)

- 此后只是打字

NANOSECONDS.toSeconds(elapsedTime);
Run Code Online (Sandbox Code Playgroud)


Lal*_*hra 6

你应该写:

    long startTime = System.nanoTime();        
    long estimatedTime = System.nanoTime() - startTime;
Run Code Online (Sandbox Code Playgroud)

在变量中分配endTime可能会导致几纳秒.在这种方法中,您将获得确切的经过时间.

然后:

TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
Run Code Online (Sandbox Code Playgroud)