Рассчитать следующее запланированное время на основе спецификации cron

Какой эффективный способ вычислить следующее время выполнения события с учетом текущего времени и спецификации cron?

Я ищу что-то другое, кроме "цикл через каждую минуту, проверяя, соответствует ли он спецификации".

Примеры спецификаций могут быть:

  • Каждый месяц, на 1-й и 15-й в 15:01
  • В 10,20,30,40,50 минут за час каждый час

Код Python был бы прекрасен, но psuedo-код или описание высокого уровня также были бы оценены.

[Обновить] Предположим, что спецификация уже разобрана и находится в некотором разумном формате.

Ответы

Ответ 1

Просто посмотрев на это, я думаю, вам нужно:

  • проанализировать спецификацию chron для пяти массивов, содержащих допустимые значения для каждого поля;
  • проанализировать "теперь" значение для каждого поля;
  • в порядке минуты, часа, {день-месяц или день недели}, месяц-год: найдите наименьшее значение массива, которое соответствует или превышает текущее значение, исправляя перенос.

Я не знаю, как обрабатывать день недели и день месяца одновременно; Я уверен, что есть способ, но, с другой стороны, я не думаю, что когда-либо видел спецификацию, которая фактически указывала и то, и другое. Я думаю, что было бы достаточно написать обработчик для обоих и выбросить ошибку, если вы получите оба.

Изменить:, видимо, если оба дня заданы день недели и день месяца, предполагается, что они будут срабатывать как, т.е. если правило равно ' 15-я, среда "будет срабатывать каждые 15-е и каждую среду.

Пакет croniter делает то, что вы хотите:

import croniter
import datetime

now = datetime.datetime.now()
sched = '1 15 1,15 * *'    # at 3:01pm on the 1st and 15th of every month
cron = croniter.croniter(sched, now)

for i in range(4):
    nextdate = cron.get_next(datetime.datetime)
    print nextdate

печатает

2011-01-15 15:01:00
2011-02-01 15:01:00
2011-02-15 15:01:00
2011-03-01 15:01:00

хотя было бы неплохо, если бы он был написан как фактический итератор. Может быть, у меня есть следующий проект: -)

Ответ 2

Later.js - это библиотека javascript, которая делает именно это. Он способен анализировать выражение Cron, а затем вычислять будущие события графика. Этот алгоритм не очень причудливый, но он выполняет эту работу. Возможно, стоит посмотреть.