Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用时间单位枚举将纳秒转换为秒?_Java_Timeunit - Fatal编程技术网

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)
。祝你好运