TimeUnit numaralandırma kullanarak nanosaniye saniye dönüştürmek nasıl?


145

Bir değeri nanosaniyeden saniyeye nasıl dönüştürebilirim?

İşte kod segmenti:

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

Hata:

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

Ne anlama geliyor?


4
Hata TimeUtil, bir enum(numaralandırıcı) olduğu için türü başlatamayacağınız anlamına gelir . Kullanmak istiyorsanız bunun yerine TimeUnitkullanmalısınız TimeUnit.NANOSECONDS.toSeconds(elapsedTime). İyi şanslar!
Daniel Kvist

Yanıtlar:


200

1.000.000.000'a bölebilirsiniz:

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

Eğer kullanırsanız TimeUnitdönüştürmek için size ondalık hassasiyet kaybetmek fakat tam sayı hassasiyetini muhafaza edeceğiz öyleyse, uzun olarak sonuç alırsınız.


78
Ama ya ikinci saniyedeki nanosaniye sayısı değişirse? : P
geofftnz

9
Bu cevap şimdi yanlış - convert()ve toFoo()yöntemlerin hepsi longartık geri dönüyor docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
Riking

3
@mbarrows Ancak bu yanıt hala sağ ki TimeUnitözgüllük kaybına çözüm sonuçlarının. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);dönecek 0, değil 0.5. Bu sadece hangisinin tercih edileceği kullanım durumunuza bağlıdır.
nbrooks

17
Burada @ nbrooks ile iyice anlaşın. TimeUnit kullanmak saniyenin kesirlerini vermez, bunun yerine 0 döndürür. Sabit kodlu 10 haneli bir sayı kullanmak istemiyorsanız, 1E9 gibi bir şey kullanın. Örneğin: double seconds = ((double) nanoseconds) / 1E9; Bunu her zaman kişisel bir tercih olarak yaparım.
TechTrip

3
Saniyenin kesirlerini almak istiyorsanız bu yöntemi TimeUnit Enum yöntemi üzerinde kullanın. TimeUnit Enum kullanmak en yakın saniyeye yuvarlanmıyor, aslında bir saniyenin kesirlerini kesiyor. Yani 4.9999999, sadece 4 olur.
Dick Lucas

354

TimeUnit Sıralama

Aşağıdaki ifade TimeUnitnanosaniyeden saniyeye dönüştürmek için enum'u (Java 5 ve üstü) kullanır:

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

14
Bu yöntemin bir saniyenin kesirlerini içermediğinden değil. Yani 4.9999999, sadece 4 saniye olacaktır.
Dick Lucas

1
Bu tercih edilir, çünkü çok hataya eğilimli olduğu için asla 1 ve ardından 0'lık bir karmaşa yazmamalısınız.
demongolem

1
bunu elapsedTime = (end_time - start_time) / 1e9 şeklinde yazabilirsiniz;
Hasson

1
59 dakika ve 50 saniye kalırsam hala 0 saat geçtiğini söyler ... Bu ideal değil. Peki bu yöntemi kesirlerle çalıştırmanın bir yolu var mı?
user1156544

58

TimeUnit bir numaralandırmadır, bu yüzden yeni bir tane oluşturamazsınız.

Aşağıdakiler 1000000000000ns birimini saniyeye dönüştürecektir.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
10e + 9 değil 1e + 12 olduğuna inanıyorum!
Adam Arold

8
Bu oldukça geç bir cevap, ancak örnekteki sayı bir saniyedeki nanos sayısı değil, sadece dönüştürülecek bir sayı. Bütün fikir bu değerleri bilmek zorunda değildir.
Nick Veys

2
Bunun kabul edilen cevap olması gerektiğini düşünüyorum. ToXxx () kullanmak, convert () yöntemini kullanmak için tercih edilir, çünkü convert () ile dönüşümün hangi yönde gerçekleştiği açık değildir, oysa toXxx () ile.
Klitos Kyriacou

21

Ayrıntı düzeyini azaltmak için statik bir içe aktarma kullanabilirsiniz:

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

-ve bundan böyle sadece yazın

NANOSECONDS.toSeconds(elapsedTime);

6

Yazmalısınız:

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

Bir değişkende endTime değerini atamak birkaç nanosaniyeye neden olabilir. Bu yaklaşımda tam olarak geçen zamanı elde edersiniz.

Ve sonra:

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

4

Bu, zamanı tam sayı değerinden daha kesin olan çift biçiminde saniyeye dönüştürür:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.