Як перетворити наносекунди в секунди за допомогою перерахунку TimeUnit?


145

Як перетворити значення з наносекунд в секунди?

Ось сегмент коду:

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.

Що це означає?


4
Помилка означає, що ти не можеш ініціювати тип TimeUtil, тому що це enum(перелік). Якщо ви хочете використовувати TimeUnit, ви повинні використовувати TimeUnit.NANOSECONDS.toSeconds(elapsedTime)замість цього. Удачі!
Даніель Квіст

Відповіді:


200

Ну, ви можете просто розділити на 1 000 000 000:

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

Якщо ви використовуєте TimeUnitдля конвертації, ви отримаєте результат як довгий, тому ви втратите десяткову точність, але збережете точність цілого числа.


78
Але що робити, якщо кількість наносекунд за секунду зміниться? : P
geofftnz

9
Ця відповідь зараз помилкова - convert()і toFoo()всі методи повертаються longз docs.oracle.com/javase/6/docs/api/java/util/concurrent/…
Riking

3
@mbarrows Однак ця відповідь все-таки правильна , оскільки TimeUnitрішення призводить до втрати специфічності. TimeUnit.SECONDS.convert(500, TimeUnit.MILLISECONDS);повернеться 0, ні 0.5. Просто від вашого випадку використання залежить, який із них є кращим.
nbrooks

17
Ретельно погоджуйтеся з @nbrooks тут. Використання TimeUnit не виводить дробів секунди, замість цього повертає 0. Якщо ви не хочете використовувати жорстко закодоване 10-значне число, тоді використовуйте щось на зразок 1E9. Наприклад: double seconds = ((double) nanoseconds) / 1E9; Я б робив це кожен раз як особисту перевагу.
TechTrip

3
Використовуйте цей метод за допомогою методу TimeUnit Enum, якщо ви хочете частки секунди. Використання TimeUnit Enum навіть не округляється до найближчої секунди, воно по суті просто рубає частки секунди. Так 4.9999999, було б просто 4.
Дік Лукас

354

TimeUnit Енум

Наступний вираз використовує TimeUnitenum (Java 5 і новіші версії) для перетворення з наносекунд в секунди:

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

14
Не те, щоб цей спосіб не включав частки секунди. Так 4.9999999, було б просто 4 секунди.
Дік Лукас

1
Це бажано, тому що ви ніколи не повинні виписувати 1, а за ним цілий безлад 0, оскільки він дуже схильний до помилок.
демонголем

1
ви можете записати його так, як це минуло час ((кінець_часу - початок_час) / 1е9;
Хассон

1
Якщо я затримаюся 59 хвилин і 50 секунд, вона все ще говорить 0h минуло ... Що не ідеально. То чи є спосіб змусити цей метод працювати з дробами?
користувач1156544

58

TimeUnit - перерахунок, тому ви не можете створити новий.

Нижче перетворяться 1000000000000ns в секунди.

TimeUnit.NANOSECONDS.toSeconds(1000000000000L);

4
Я вважаю, що це 10e + 9, а не 1e + 12!
Адам Арольд

8
Це досить пізня відповідь, але число в прикладі - це не кількість наносів за секунду, це просто число для перетворення. Вся ідея полягає у тому, щоб не знати цих цінностей.
Нік Вейс

2
Я думаю, це має бути прийнятою відповіддю. Використовувати toXxx () є кращим, ніж використовувати convert (), тому що з convert () не очевидно, в якому напрямку відбувається перетворення, тоді як з toXxx () - це.
Клітос Кіріако

21

Щоб зменшити багатослів’я, ви можете використовувати статичний імпорт:

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

-і відтепер просто наберіть

NANOSECONDS.toSeconds(elapsedTime);

6

Ви повинні написати:

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

Призначення endTime змінної може спричинити кілька наносекунд. При такому підході ви отримаєте точний минулий час.

І потім:

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

4

Це перетворить час у секунду у подвійний формат, який є більш точним, ніж ціле значення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.