Hoe converteer je nanoseconden naar seconden met behulp van de TimeUnit-enum?

Hoe converteer je een waarde van nanoseconden naar seconden?

Dit is het codesegment:

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"); 
}}

De fout is

Stamper.java:16:  enum types may not be instantiated.

Wat betekent dit?


Antwoord 1, autoriteit 100%

Nou, je kunt gewoon delen door 1.000.000.000:

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

Als u TimeUnitgebruikt om te converteren, krijgt u uw resultaat als een long, zodat u de decimale precisie verliest, maar de precisie van hele getallen behoudt.


Antwoord 2, autoriteit 98%

TimeUnitEnum

De volgende uitdrukking gebruikt de TimeUnitenum (Java 5 en later) om te converteren van nanoseconden naar seconden:

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

Antwoord 3, autoriteit 28%

TimeUnit is een opsomming, dus u kunt geen nieuwe aanmaken.

Het volgende zet 1000000000000ns om in seconden.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

Antwoord 4, autoriteit 11%

Om breedsprakigheid te verminderen, kunt u een statische import gebruiken:

import static java.util.concurrent.TimeUnit.NANOSECONDS;

-en typ voortaan gewoon

NANOSECONDS.toSeconds(elapsedTime);

Antwoord 5, autoriteit 3%

Je moet schrijven:

   long startTime = System.nanoTime();        
    long estimatedTime = System.nanoTime() - startTime;

Het toewijzen van de eindtijd in een variabele kan enkele nanoseconden veroorzaken. In deze aanpak krijgt u de exacte verstreken tijd.

En dan:

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

Antwoord 6, autoriteit 2%

Dit converteert een tijd naar seconden in een dubbel formaat, wat nauwkeuriger is dan een geheel getal:

double elapsedTimeInSeconds = TimeUnit.MILLISECONDS.convert(elapsedTime, TimeUnit.NANOSECONDS) / 1000.0;

Antwoord 7

JDK9+ oplossing met java.time.Duration

Duration.ofNanos(1_000_000L).toSeconds()

https:// docs.oracle.com/javase/9/docs/api/java/time/Duration.html#ofNanos-long-

https://docs .oracle.com/javase/9/docs/api/java/time/Duration.html#toSeconds–


Antwoord 8

In Java 8of Kotlingebruik ik Duration.ofNanos(1_000_000_000)zoals

val duration = Duration.ofNanos(1_000_000_000)
logger.info(String.format("%d %02dm %02ds %03d",
                elapse, duration.toMinutes(), duration.toSeconds(), duration.toMillis()))

Lees meer https://docs.oracle .com/javase/8/docs/api/java/time/Duration.html

Other episodes