В настоящее время я пытаюсь решить проблему с моим Java-кодом. По сути, мне нужны переменные: currentTime
типа Instant
и activeAfterSecond
типа Duration
(из пакета java.time).
По сути, я хочу проверить, прошел ли currentTime заданную продолжительность (или достиг ее). Итак, в псевдокоде что-то вроде этого:
if (currentTime >= duration){
// do something
}
Очевидно, что что-то подобное не работает, поскольку Мгновения и Продолжительность нельзя сравнивать друг с другом. Я пытался выяснить, какой метод из пакетов java.time.Instant и java.time.Duration лучше всего подходит для сравнения (например, используя что-то вроде getSeconds()
из пакета Duration), но не смог найти подходящего, осуществимое решение.
Кто-нибудь знает, как я могу решить эту проблему? Помощь будет оценена по достоинству!
(на основе ответа Диего)
Duration startAndCurrentDur = Duration.between(startTime, currentTime);
Duration activeAfterSecond = Duration.ofSeconds(5); // just an example
if (startAndCurrentDur.compareTo(activeAfterSecond) >= 0){ //enter if branch when activeAfterSecond equal or greater than startAndCurrentDur
// do something
}
это похоже на желание сравнить фактическое время/дату с периодом в 5 дней?? Сегодня через 5 дней? Вы можете добавить/вычесть Продолжительность к/из Мгновенного события (а затем сравнить полученный Мгновенный результат с другим); или сравните разницу между двумя мгновениями с продолжительностью.
Вам нужна «точка привязки» (время начала, эпоха, как бы вы ее ни называли), по сути, момент, который вы бы посчитали «длительностью 0», если хотите.
Например, 2024-08-14T17:05:00Z позже, чем продолжительность «один час»? Например, это так, если точка привязки — 2024-08-14T16:00:00Z, но не так, если точка привязки — 2024-08-14T16:15:00Z.
После того, как вы определились со своей «точкой привязки», все становится проще — просто добавьте продолжительность к точке привязки, чтобы определить момент, в который вы хотите, чтобы результат изменился с ложного на истинный, и тогда у вас будет всего два мгновения. сравнивать - что поддерживается очень просто.
Без опорной точки не будет значимого сравнения. Это не аспект реализации: это фундаментально для того, что вы пытаетесь сравнить.
Или, проще говоря, «длительность (прошедшее время) с каких пор?»
Вам нужна еще одна переменная Instant
с lastTime
(currentTime
предыдущего шага). Затем вы можете попробовать что-то вроде этого:
if (Duration.between (lastTime, currentTime) >= duration) {
// do Something
lastTime = currentTime;
}
Это решение, которое я выбрал. Однако я хочу отметить, что вы не можете использовать операнд >= для длительности (возможно, из-за формата длительности). Вместо этого я использовал метод CompareTo.
Установите начальный момент.
Instant start = Instant.now() ;
Укажите время, которое должно пройти.
Duration duration = Duration.ofSeconds( 7 ) ;
Рассчитайте свой будущий момент.
Instant due = start.plus( duration ) ;
Позже проверьте, не истек ли текущий момент.
if
(
due.isBefore( Instant.now() )
)
{ … time elapsed, proceed … }
else
{ … not yet due … }
Вы сказали (моя редакция):
Мгновения и длительности нельзя [сравнивать] друг с другом.
Правда, Instant
и Duration
нельзя сравнивать друг с другом. Но их можно использовать для выполнения математических вычислений с датой и временем, перемещаясь из одного момента времени (Instant
) в другой момент времени в будущее (положительная Duration
сумма) или обратно в прошлое (отрицательная Duration
сумма).
Имейте в виду, что Duration
по определению не привязан к временной шкале. Объект Duration
представляет собой промежуток времени, но без определенного начала или конца.
Если вам нужен промежуток времени, привязанный к временной шкале, добавьте в свой проект библиотеку ThreeTen-Extra . Там вы найдете класс Интервал. Объекты класса Interval
знают свою начальную и конечную точки на временной шкале, определяемые как пара Instant
объектов.
Interval z = Interval.of( x , y ) ;
Рисуем временную шкалу:
Instant Instant Instant Instant
past <-------a----b-----------------x----y---------> future
Две пары a и b и x и y имеют одинаковое количество Duration
(на нашем рисунке по четыре тире).
true = Duration.between( a , b ).equals( Duration.between( x , y ) ) ;
Но объекты Interval
каждой пары не одинаковы. Интервал a-b произошел раньше, чем интервал x-y.
false = Interval.of( a , b ).equals( Interval.of( x , y ) ) ;
Вы можете сравнивать только значения одного и того же типа.