- моя база данных имеет выражение
10 18 16 ? * SUN,MON,WED,FRI *
cron, а затем как преобразовать в дату Java. - как сравнить с нынешним временем.
- и еще один - как сравнивать с выражениями cron, т.е.
10 18 16 ? * SUN,MON,WED,FRI *
и0 30 9 30 * ?
- пожалуйста, объясните пример кода с использованием кварцевого или весеннего планирования.
Разбор выражения cron в дату Java
Ответы (4)
Пожалуйста, используйте:
import org.springframework.scheduling.support.CronSequenceGenerator;
final String cronExpression = "0 45 23 * * *";
final CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression);
final Date nextExecutionDate = generator.next(new Date());
... а затем я предлагаю использовать Joda DateTime для сравнения дат.
Я написал небольшой класс для обработки выражений cron, доступный здесь: https://github.com/frode-carlsen/cron
На основе Joda-time, но его должно быть довольно легко портировать на API времени Java8. Это также позволяет встраивать модульные тесты, выполнять симуляции и т. д., настраивая смещение DateTime в Joda-time.
Он также имеет довольно хорошее тестовое покрытие (было выполнено как TDD Kata).
Обновление Благодаря вкладу пользователя github https://github.com/zemiak. В обоих случаях синтаксический анализатор выражений представляет собой один крошечный класс, который можно легко скопировать в ваш собственный проект.
Вы можете изучить org.quartz.CronExpression класс в Quartz API.
Обратите внимание, что вы не можете просто сравнить выражение cron с датой, потому что выражение cron (обычно) представляет собой последовательность различных дат. В любом случае вам могут пригодиться следующие методы:
public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)
Что касается сравнения двух выражений cron, что бы вы хотели сравнить? Единственное, что IMO имеет смысл сравнивать, — это даты следующих «триггеров», то есть даты, полученные из вызовов getNextValidTimeAfter([some reference date]).
Возможно, вы можете проверить cron-utils. У него есть несколько утилит для получения следующего/предыдущего выполнения с учетом определенной даты, например: сейчас . Работает с JodaTime, но вы можете получить оттуда JavaDate. Библиотека не зависит от планировщика: вы просто предоставляете строку с выражением cron. Совместим с JDK6.