Какой объект библиотеки Java инкапсулирует число и TimeUnit?

Я хочу передать номер времени и TimeUnit он находится в.

long number = some number;
TimeUnit timeUnit = some arbitrary time unit

Что может удерживать как время, так и время в одном Object из библиотек Java?

3 ответа

Не существует объекта библиотеки Java, который инкапсулирует число и произвольный TimeUnit, Однако в Java 8 есть один, который конвертирует себя в любую требуемую единицу времени:

java.time.Duration

Длительность сохраняет предоставленное количество, а затем обеспечивает сравнение и преобразование во все другие единицы времени. Например:

// Create duration from nano time
Duration systemTime = Duration.ofNanos(System.nanoTime());

// Create duration from millis time
Duration systemTime = Duration.ofMillis(System.currentTimeMillis());

Конечно, если выполнять сложение и вычитание или другие математические операции, точность будет такой же хорошей, как и точность текущей операции и Duration,

/**
* Example that tells if something has reached the required age
* TRUE IF THE current system time is older or equal to the required system time
*/
    // TRUE IF THE FILE HAS NOT WAITED ENOUGH TIME AFTER LAST CREATE/MODIFY
    private boolean isMature() {
        // it is not known whether required age is nanos or millis
        Duration requiredAge = systemTimeWhenMature();
        // so create a duration in whatever time unit you have
        // more precise = possibly better here
        Duration actualAge = Duration.ofNanos(System.nanoTime());
       // if ON or OLDER THAN REQUIRED AGE
       // actualAge - requiredAge  = balance
       // 20 - 21 = -1 (NOT MATURE)
       // 21 - 21 =  0 (OK)
       // 22 - 21 =  1 (OK)
       Duration balance = actualAge.minus(requiredAge);
       if (balance.isNegative()) {
           logger.info("Something not yet expired. Expires in {} millis.", balance.negated());
           return false;
       } else {
           return true;
       }
    }

И в Duration есть еще много методов, которые полезны для преобразования и обработки сохраненного количества в различных единицах.

Важно понимать, как точность повлияет на вычисления. Это показывает общий контракт точности на примере:

    // PICK A NUMBER THAT IS NOT THE SAME WHEN CONVERTED TO A LESSER PRECISION
    long timeNanos = 1234567891011121314L;
    long timeMillis = TimeUnit.MILLISECONDS.convert(timeNanos, TimeUnit.NANOSECONDS);

    // create from milliseconds
    Duration millisAccurate = Duration.ofMillis(timeMillis);
    Duration nanosAccurate = Duration.ofNanos(timeNanos);

    // false because of precision difference
    assertFalse(timeMillis == timeNanos);
    assertFalse(millisAccurate.equals(nanosAccurate));

    // true because same logical precision conversion takes place
    assertTrue(timeMillis - timeNanos <= 0);
    assertTrue(millisAccurate.minus(nanosAccurate).isNegative());

    // timeNanos has greater precision and therefore is > timeMillie
    assertTrue(timeNanos - timeMillis > 0);
    assertTrue(nanosAccurate.minus(millisAccurate).negated().isNegative());

В двух словах.. Я не могу поверить, что мне понадобилось так много времени, чтобы найти Duration!:)

В Joda-Time есть Interval, но вам нужно создать Java Bean (возможно, назовите его Interval), если вы хотите использовать только типы объектов, включающие JRE.

TimeUnit - просто перечисление, содержащее некоторые типы единиц времени, такие как Секунда, Миллисекунды,...

TimeUnit НЕ для удержания времени, НО вы можете преобразовать время в единице в другую единицу, используя TimeUnit API.

Я думаю, что вы должны создать свой объект, чтобы держать время и его единицу.

Если вы используете Java 8. Вы можете работать с некоторым новым API даты

http://download.java.net/jdk8/docs/api/java/time/package-summary.html

Другие вопросы по тегам