Какой объект библиотеки 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