Рассчитать следующее запланированное время на основе спецификации хрон - PullRequest
12 голосов
/ 06 января 2011

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

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

Примеры характеристик могут быть:

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

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

[Update] Предположим, что спецификация уже проанализирована и имеет какой-то приемлемый формат.

Ответы [ 2 ]

14 голосов
/ 06 января 2011

Просто глядя на это, я думаю, что вам нужно:

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

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

Редактировать: очевидно, если указаны оба дня недели и дня месяца, предполагается, что они будут срабатывать по обоим - т. Е. Если правило 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

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

3 голосов
/ 09 февраля 2012

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

...