- Баллы
- 66
- Имя в Minecraft
- TheNoctural
а как запускать бы шелудер что бы оно два разо не выдало true и не добавило два разаНу, раньше времени точно не выполнится. А вот верхнюю границу я бы не ставил. Получится условие типа time >= 01:00
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
а как запускать бы шелудер что бы оно два разо не выдало true и не добавило два разаНу, раньше времени точно не выполнится. А вот верхнюю границу я бы не ставил. Получится условие типа time >= 01:00
public final class Until {
private final int hours;
private final int minutes;
private final int seconds;
private long expectedMillis;
public Until(
@Range(from = 0, to = 23) int hours,
@Range(from = 0, to = 59) int minutes,
@Range(from = 0, to = 59) int seconds
) {
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
findNext();
}
private void findNext() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime expected = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), hours, minutes, seconds);
if (expected.isBefore(now) || expected.isEqual(now)) {
expected = expected.plusDays(1);
}
expectedMillis = expected.atZone(ZoneId.systemDefault()).toEpochSecond() * 1000L;
}
public boolean isTime() {
if (System.currentTimeMillis() >= expectedMillis) {
findNext();
return true;
}
return false;
}
public double secondLeft() {
return (expectedMillis - System.currentTimeMillis()) / 1000d;
}
}
if (until.isTime()) {
// Время настало
}
огромное спасибо, все прекрасноПонимаю, что лучше с ложки не кормить, но с LocalDateTime возни будет слишком много - нагляднее лучше.
Состряпал на коленке по-быстрому небольшой утилитарный класс. Даешь ему час, минуту и секунду, в которые нужно произвести что-либо. В findNext он просчитывает секунду следующего срабатывания. Метод isTime проверяет, прошла ли та секунда, и если прошла, ищет новую и выдает true; иначе просто false. Для удобства добавил secondsLeft - сколько секунд осталось до следующего срабатывания.PHP:public final class Until { private final int hours; private final int minutes; private final int seconds; private long expectedMillis; public Until( @Range(from = 0, to = 23) int hours, @Range(from = 0, to = 59) int minutes, @Range(from = 0, to = 59) int seconds ) { this.hours = hours; this.minutes = minutes; this.seconds = seconds; findNext(); } private void findNext() { LocalDateTime now = LocalDateTime.now(); LocalDateTime expected = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), hours, minutes, seconds); if (expected.isBefore(now) || expected.isEqual(now)) { expected = expected.plusDays(1); } expectedMillis = expected.atZone(ZoneId.systemDefault()).toEpochSecond() * 1000L; } public boolean isTime() { if (System.currentTimeMillis() >= expectedMillis) { findNext(); return true; } return false; } public double secondLeft() { return (expectedMillis - System.currentTimeMillis()) / 1000d; } }
Создаешь один раз Until и хранишь где-нибудь в своем классе. В своем шедулере - не так важно, с какой именно задержкой будешь выполнять - просто делаешь проверку вроде
и делаешь что хочешь.PHP:if (until.isTime()) { // Время настало }