Bagaimana cara mengubah nanodetik ke detik menggunakan TimeUnit enum?


145

Bagaimana cara mengubah nilai dari nanodetik ke detik?

Inilah segmen kode:

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

Kesalahannya adalah

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

Apa artinya ini?


4
Kesalahan berarti bahwa Anda tidak dapat instantiate tipe TimeUtil, karena itu adalah enum(enumerator). Jika Anda ingin menggunakan TimeUnit, Anda harus menggunakannya TimeUnit.NANOSECONDS.toSeconds(elapsedTime). Semoga berhasil!
Daniel Kvist

Jawaban:


200

Nah, Anda bisa membagi dengan 1.000.000.000:

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

Jika Anda gunakan TimeUnituntuk mengonversi, Anda akan mendapatkan hasil sebagai panjang, sehingga Anda akan kehilangan ketepatan desimal tetapi mempertahankan ketelitian angka bulat.


78
Tetapi bagaimana jika jumlah nanodetik dalam satu detik berubah? : P
geofftnz

9
Jawaban ini sekarang salah - convert()dan toFoo()metode semuanya kembali longsekarang docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
Riking

3
@ palrow Namun jawaban ini masih benar bahwa TimeUnitsolusi menghasilkan hilangnya kekhususan. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);akan kembali 0, tidak 0.5. Ini hanya tergantung pada kasus penggunaan Anda mana yang lebih disukai.
nbrooks

17
Sepenuhnya setuju dengan @nbrooks di sini. Menggunakan TimeUnit tidak akan menghasilkan sepersekian detik, melainkan mengembalikan 0. Jika Anda tidak ingin menggunakan nomor 10 digit kode yang keras maka gunakan sesuatu seperti 1E9. Sebagai contoh: double seconds = ((double) nanoseconds) / 1E9; Saya akan melakukan ini setiap waktu sebagai preferensi pribadi.
TechTrip

3
Gunakan metode ini di atas metode TimeUnit Enum jika Anda ingin sepersekian detik. Menggunakan TimeUnit Enum bahkan tidak membulatkan ke detik terdekat, itu pada dasarnya hanya memenggal pecahan satu detik. Jadi 4.9999999, akan menjadi 4.
Dick Lucas

354

TimeUnit Enum

Ungkapan berikut menggunakan TimeUnitenum (Java 5 dan yang lebih baru) untuk mengkonversi dari nanodetik ke detik:

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

14
Bukan berarti metode ini tidak termasuk sepersekian detik. Jadi 4.9999999, hanya akan menjadi 4 detik.
Dick Lucas

1
Ini lebih disukai karena Anda tidak boleh menulis 1 diikuti oleh kekacauan 0 karena itu sangat rentan kesalahan.
demongolem

1
Anda dapat menulis seperti ini elapsedTime = (end_time - start_time) / 1e9;
Hasson

1
Jika saya tinggal 59 menit dan 50 detik masih mengatakan 0 jam berlalu ... Yang tidak ideal. Jadi adakah cara untuk membuat metode ini bekerja dengan pecahan?
user1156544

58

TimeUnit adalah enum, jadi Anda tidak dapat membuat yang baru.

Berikut ini akan mengonversi 1000000000000ns ke detik.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
Saya percaya ini 10e + 9 bukan 1e + 12!
Adam Arold

8
Ini adalah balasan yang sangat terlambat, tetapi jumlah dalam contoh ini bukan jumlah nanos dalam satu detik, itu hanya angka untuk dikonversi. Seluruh ide adalah tidak harus mengetahui nilai-nilai itu.
Nick Veys

2
Saya pikir ini harus menjadi jawaban yang diterima. Menggunakan toXxx () lebih disukai daripada menggunakan convert () karena dengan convert () tidak jelas ke arah mana konversi terjadi, sedangkan dengan toXxx () itu.
Klitos Kyriacou

21

Untuk mengurangi verbositas, Anda dapat menggunakan impor statis:

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

-dan selanjutnya ketik saja

NANOSECONDS.toSeconds(elapsedTime);

6

Anda harus menulis:

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

Menetapkan endTime dalam suatu variabel dapat menyebabkan beberapa nanodetik. Dalam pendekatan ini Anda akan mendapatkan waktu berlalu yang tepat.

Lalu:

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

4

Ini akan mengonversi waktu menjadi detik dalam format ganda, yang lebih tepat daripada nilai integer:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.