Сравнение того, прошел ли Instant Продолжительность в Java

Проблема

В настоящее время я пытаюсь решить проблему с моим 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
}

Вы можете сравнивать только значения одного и того же типа.

Roman C 14.08.2024 19:07

это похоже на желание сравнить фактическое время/дату с периодом в 5 дней?? Сегодня через 5 дней? Вы можете добавить/вычесть Продолжительность к/из Мгновенного события (а затем сравнить полученный Мгновенный результат с другим); или сравните разницу между двумя мгновениями с продолжительностью.

user85421 14.08.2024 20:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужна «точка привязки» (время начала, эпоха, как бы вы ее ни называли), по сути, момент, который вы бы посчитали «длительностью 0», если хотите.

Например, 2024-08-14T17:05:00Z позже, чем продолжительность «один час»? Например, это так, если точка привязки — 2024-08-14T16:00:00Z, но не так, если точка привязки — 2024-08-14T16:15:00Z.

После того, как вы определились со своей «точкой привязки», все становится проще — просто добавьте продолжительность к точке привязки, чтобы определить момент, в который вы хотите, чтобы результат изменился с ложного на истинный, и тогда у вас будет всего два мгновения. сравнивать - что поддерживается очень просто.

Без опорной точки не будет значимого сравнения. Это не аспект реализации: это фундаментально для того, что вы пытаетесь сравнить.

Или, проще говоря, «длительность (прошедшее время) с каких пор?»

Diego Ferruchelli 14.08.2024 20:14
Ответ принят как подходящий

Вам нужна еще одна переменная Instant с lastTime (currentTime предыдущего шага). Затем вы можете попробовать что-то вроде этого:

if (Duration.between (lastTime, currentTime) >= duration) {
    // do Something
    lastTime = currentTime;
}

Это решение, которое я выбрал. Однако я хочу отметить, что вы не можете использовать операнд >= для длительности (возможно, из-за формата длительности). Вместо этого я использовал метод CompareTo.

Palucca 15.08.2024 11:29

Установите точку, добавьте время до истечения

Установите начальный момент.

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

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