def process(expression, start_date, end_date=None):
"""Given a cron expression and a start/end date returns an rrule
Works with "naive" datetime objects.
"""
if start_date.tzinfo or (end_date and end_date.tzinfo):
raise TypeError("Timezones are forbidden in this land.")
arguments = parse_cron(expression)
# as rrule will strip out microseconds, we need to do this hack :)
# we could use .after but that changes the iface
# The idea is, as the cron expresion works at minute level, it is fine to
# set the start time one second after the minute. The key is not to generate
# the current minute.
# Ex: if start time is 05:00.500 you should not generate 05:00
if start_date.second == 0 and start_date.microsecond != 0:
start_date = start_date + dt.timedelta(0, 1)
arguments["dtstart"] = start_date
if end_date:
arguments["until"] = end_date
# TODO: This can be optimized to values bigger than minutely
# by checking if the minutes and hours are provided.
# After hours (rrule.DAILY) it gets trickier as we have multiple
# parameters affecting the recurrence (weekday/ month-day)
return rrule.rrule(rrule.MINUTELY, **arguments)
评论列表
文章目录