Calculate next scheduled time based on cron spec

后端 未结 2 413
轻奢々
轻奢々 2021-02-01 21:05

What\'s an efficient way to calculate the next run time of an event given the current time and a cron spec?

I\'m looking for something other than \"loop through every mi

2条回答
  •  时光说笑
    2021-02-01 21:33

    Just looking at it, I think you need to:

    • parse the chron spec to five arrays containing acceptable values for each field;
    • parse 'now' to a value for each field;
    • in order of minute, hour, {day-of-month OR day-of-week}, month-of year: find the lowest array value that matches or exceeds the current value, correcting for carry.

    I don't know how to handle day-of-week and day-of-month simultaneously; I am sure there is a way, but on the other hand I don't think I've ever seen a spec that actually specified both. I think it would be sufficient to write a handler for either and throw an error if you receive both.

    Edit: apparently if day-of-week and day-of-month are both specified, it is supposed to fire on both - ie if the rule is '15th, Wednesday' it will fire on every 15th and every Wednesday.

    The croniter package does what you want:

    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
    

    prints

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

    although it would be nice if it were written as an actual iterator. Maybe I've got my next project ;-)

提交回复
热议问题