Java 如何使用时间单位枚举将纳秒转换为秒?
如何将值从纳秒转换为秒 以下是代码段:Java 如何使用时间单位枚举将纳秒转换为秒?,java,timeunit,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 = en
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.
这意味着什么?时间单位是一个枚举,因此无法创建新的枚举 以下内容将10000000000ns转换为秒
TimeUnit.NANOSECONDS.toSeconds(1000000000000L);
你可以除以100000000:
long elapsedTime = end - start;
double seconds = (double)elapsedTime / 1_000_000_000.0;
如果使用TimeUnit
进行转换,结果会很长,因此将丢失十进制精度,但仍保持整数精度。TimeUnit
Enum
以下表达式使用枚举(Java 5及更高版本)将纳秒转换为秒:
TimeUnit.SECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS)
要减少冗长,可以使用静态导入:
import static java.util.concurrent.TimeUnit.NANOSECONDS;
-从今以后只要打字
NANOSECONDS.toSeconds(elapsedTime);
你应该写:
long startTime = System.nanoTime();
long estimatedTime = System.nanoTime() - startTime;
在变量中指定endTime可能会导致几纳秒。在这种方法中,您将获得准确的运行时间
然后:
TimeUnit.SECONDS.convert(estimatedTime, TimeUnit.NANOSECONDS)
这将以双精度格式将时间转换为秒,比整数值更精确:
double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;
JDK9+使用java.time.Duration的解决方案
Duration.ofNanos(1_000_000L).toSeconds()
在
Java8
或Kotlin
中,我使用了名词的持续时间(1_000_000_000)
类似于
val duration = Duration.ofNanos(1_000_000_000)
logger.info(String.format("%d %02dm %02ds %03d",
elapse, duration.toMinutes(), duration.toSeconds(), duration.toMillis()))
阅读更多但是如果一秒钟内的纳秒数发生变化怎么办p这个答案现在是错误的-
convert()
和toFoo()
方法都返回long
s now@mbarrows,但是这个答案仍然正确,因为TimeUnit
解决方案会导致特定性的丧失<代码>时间单位。秒。转换(500,时间单位。毫秒)将返回0
,而不是0.5
。这完全取决于您的用例,其中哪一个更可取。完全同意这里的@nbrooks。使用TimeUnit不会输出一秒的分数,而是返回0。如果您不想使用硬编码的10位数字,请使用类似1E9的代码。例如:double seconds=((双)纳秒)/1E9
我每次都会这样做,这是我个人的喜好。如果你想要几分之一秒的时间,可以使用这个方法而不是时间单位枚举方法。使用时间单位枚举甚至不舍入到最近的秒,它本质上只是切掉一秒的分数。所以4.999999,就是4。我相信它是10e+9,而不是1e+12!这是一个相当晚的答复,但示例中的数字不是一秒钟内的纳米数量,它只是一个需要转换的数字。整个想法是不必知道这些价值观。我认为这应该是公认的答案。使用toXxx()比使用convert()更可取,因为使用convert()时,转换发生的方向不明显,而使用toXxx()时,转换发生的方向不明显。这并不是说此方法不包含一秒钟的分数。因此,4.9999999只需4秒。这是首选的,因为您不应该写出1,然后再写出一大堆0,因为它非常容易出错。您可以这样写:elapsedTime=(end_time-start_time)/1e9;如果我停留59分50秒,它仍然显示0小时过去了。。。这并不理想。那么有什么方法可以使这个方法与分数一起工作呢?这个错误意味着你不能实例化类型TimeUtil
,因为它是一个enum
(枚举器)。如果要使用时间单位
,则应改为使用时间单位.NANOSECONDS.toSeconds(elapsedTime)
。祝你好运