Разбор выражения cron в дату Java

  • моя база данных имеет выражение 10 18 16 ? * SUN,MON,WED,FRI * cron, а затем как преобразовать в дату Java.
  • как сравнить с нынешним временем.
  • и еще один - как сравнивать с выражениями cron, т.е. 10 18 16 ? * SUN,MON,WED,FRI * и 0 30 9 30 * ?
  • пожалуйста, объясните пример кода с использованием кварцевого или весеннего планирования.

person user3599212    schedule 23.05.2014    source источник


Ответы (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 для сравнения дат.

person Matt    schedule 15.12.2015
comment
Превосходно! Большое спасибо! - person DmitryKanunnikoff; 24.06.2017
comment
В весенней реализации cron фактически отсутствует одна функция - поля «день» и «день недели» объединяются по логике И, а не по ИЛИ, как в cron. - person Eugene; 28.05.2018
comment
@ Юджин, я не думаю, что это недостаток ... вы можете легко смоделировать выражения с ИЛИ, предоставив 2 выражения. С AND у вас есть преимущество, которое вы можете выполнить, например. каждый 2-й вторник в... - person Michael Mangeng; 26.06.2018

Я написал небольшой класс для обработки выражений cron, доступный здесь: https://github.com/frode-carlsen/cron

На основе Joda-time, но его должно быть довольно легко портировать на API времени Java8. Это также позволяет встраивать модульные тесты, выполнять симуляции и т. д., настраивая смещение DateTime в Joda-time.

Он также имеет довольно хорошее тестовое покрытие (было выполнено как TDD Kata).

Обновление Благодаря вкладу пользователя github https://github.com/zemiak. В обоих случаях синтаксический анализатор выражений представляет собой один крошечный класс, который можно легко скопировать в ваш собственный проект.

person f.carlsen    schedule 30.05.2014
comment
Это на центральном maven? - person oshai; 22.01.2015
comment
Нет, это всего лишь один класс, зависящий только от joda-time, так что я не заморачивался. Не стесняйтесь разветвлять или копировать - person f.carlsen; 27.03.2015
comment
Эй, это очень круто. Я использовал ваш код для замены cron-utils, которые зависят от гуавы, гигантской банки размером более 2 МБ в моем проекте: github.com/actframework/actframework/blob/master/src/main/java/ - person Gelin Luo; 25.03.2016
comment
Кажется, что cron-utils больше не требует зависимости от гуавы. Версия 5.0.0 основана на JDK8 и больше не нуждается в гуаве или джодатайме. - person sashimi; 08.08.2016
comment
Это было именно то, что я искал. Небольшой класс, выполняющий синтаксический анализ в стиле cron. Большое спасибо! - person gdany; 13.11.2020

Вы можете изучить org.quartz.CronExpression класс в Quartz API.

Обратите внимание, что вы не можете просто сравнить выражение cron с датой, потому что выражение cron (обычно) представляет собой последовательность различных дат. В любом случае вам могут пригодиться следующие методы:

public boolean isSatisfiedBy(Date date)
public Date getNextValidTimeAfter(Date date)

Что касается сравнения двух выражений cron, что бы вы хотели сравнить? Единственное, что IMO имеет смысл сравнивать, — это даты следующих «триггеров», то есть даты, полученные из вызовов getNextValidTimeAfter([some reference date]).

person Jan Moravec    schedule 26.05.2014
comment
Он основан на Joda-Time? или что?! - person Dr.jacky; 11.05.2015
comment
Мы хотим преобразовать cron в дату java. Каков метод достижения? - person Dr.jacky; 11.05.2015
comment
Обычно вы не можете преобразовать выражение cron в один экземпляр Date, потому что выражение cron обычно представляет серию дат. Чтобы получить серию Date, я думаю, вы можете неоднократно вызывать метод getNextValidTimeAfter(Date) и использовать возвращаемые значения в качестве входного значения для следующего вызова. Чтобы ответить на ваш предыдущий вопрос, Quartz API не использует Joda-Time, он использует API-интерфейсы java.util Date/Calendar. - person Jan Moravec; 11.05.2015

Возможно, вы можете проверить cron-utils. У него есть несколько утилит для получения следующего/предыдущего выполнения с учетом определенной даты, например: сейчас . Работает с JodaTime, но вы можете получить оттуда JavaDate. Библиотека не зависит от планировщика: вы просто предоставляете строку с выражением cron. Совместим с JDK6.

person sashimi    schedule 20.05.2015
comment
cron-utils хорош. Единственное, у него есть зависимость от гуавы, размер которой превышает 2 МБ. - person Gelin Luo; 25.03.2016
comment
Зависимость от гуавы была проблемой. Начиная с версии 5.0.0 они удалили его, перейдя на JDK8. Теперь у библиотеки еще меньше зависимостей, так как они также избавились от jodatime, используя новую поддержку Java для времени. - person sashimi; 08.08.2016
comment
звучит неплохо. Но теперь он привязан к Java8. В итоге я использую этот анализатор одного файла: github.com/frode-carlsen/cron/blob/master/src/main/java/fc/cron/ - person Gelin Luo; 08.08.2016
comment
Конечно, это вариант :) В конце концов вам нужно привязаться к какому-нибудь JDK. - person sashimi; 08.08.2016
comment
Спасибо за это предложение. Мне нужна была поддержка joda-time в core-utils. Поэтому я выбираю версию 4.1.3. Работает как положено. - person user238607; 04.08.2017