Python 如何计算计划事件下次执行前的时间增量

Python 如何计算计划事件下次执行前的时间增量,python,datetime,Python,Datetime,我有三个列表,它们定义了任务的执行时间: 分钟:0-59之间的整数列表,表示执行时间的分钟数 hour:0-23之间的整数列表,表示一天中应执行的小时数 一周中的第几天:0-6之间的整数列表,其中周日=0,周六=6,表示一周中应执行的天数 有没有一种简单的方法可以计算Python中下一次执行之前的时间增量 谢谢 编辑: 例如,如果我们有以下列表: day_of_week = [0] hour = [1] minute = [0, 30] 该任务应每周运行两次,时间为每个星期天的1:00和1:3

我有三个列表,它们定义了任务的执行时间:

  • 分钟:0-59之间的整数列表,表示执行时间的分钟数
  • hour:0-23之间的整数列表,表示一天中应执行的小时数
  • 一周中的第几天:0-6之间的整数列表,其中周日=0,周六=6,表示一周中应执行的天数
  • 有没有一种简单的方法可以计算Python中下一次执行之前的时间增量

    谢谢

    编辑: 例如,如果我们有以下列表:

    day_of_week = [0]
    hour = [1]
    minute = [0, 30]
    
    该任务应每周运行两次,时间为每个星期天的1:00和1:30。 我想根据当前时间计算下一次发生之前的时间增量。

    使用(编辑以解决OP的更新问题):

    这是下一次Delta:

    print(deltas[0])
    # 4 days, 14:22:00
    
    以下是相应的日期时间:

    print(now+deltas[0])
    # 2010-09-02 01:04:23.258204
    
    请注意,dateutil使用约定Monday=0,Sunday=6。

    使用(编辑以解决OP的更新问题):

    这是下一次Delta:

    print(deltas[0])
    # 4 days, 14:22:00
    
    以下是相应的日期时间:

    print(now+deltas[0])
    # 2010-09-02 01:04:23.258204
    

    请注意,dateutil使用约定Monday=0,Sunday=6。

    以防有人感兴趣,这是我使用~unutbu建议开发的代码。它的主要优点是伸缩性好

    import datetime
    import dateutil.relativedelta as dr
    
    def next_ocurrance(minutes, hours, days_of_week):
        # days_of_week convention: Sunday = 0, Saturday = 6
        # dateutil convention: Monday = 0, Sunday = 6
    
        now = datetime.datetime.now()
        weekday = now.isoweekday()
        execute_this_hour = weekday in days_of_week \
                            and now.hour in hours \
                            and now.minute < max(minutes)
    
        if execute_this_hour:
            next_minute = min([minute for minute in minutes
                               if minute > now.minute])
            return now + dr.relativedelta(minute=next_minute,
                                          second=0,
                                          microsecond=0)
        else:
            next_minute = min(minutes)
    
        execute_today = weekday in day_of_week \
                        and (now.hour < max(hours) or execute_this_hour)
    
        if execute_today:
            next_hour = min([hour for hour in hours if hour > now.hour])
            return now + dr.relativedelta(hour=next_hour,
                                          minute=next_minute,
                                          second=0,
                                          microsecond=0)
        else:
            next_hour = min(hours)
            next_day = min([day for day in days_of_week if day > weekday] \
                           or days_of_week)
    
            return now + dr.relativedelta(weekday=(next_day - 1) % 7,
                                          hour=next_hour,
                                          minute=next_minute,
                                          second=0,
                                          microsecond=0)
    if __name__=='__main__':
        day_of_week = [4]
        hour = [1, 10, 12, 13]
        minute = [4, 14, 34, 51, 58]
        print next_ocurrance(minute, hour, day_of_week)
    
    导入日期时间
    将dateutil.relativedelta作为dr导入
    def下一周(分钟、小时、星期):
    #每周的天数约定:周日=0,周六=6
    #dateutil约定:周一=0,周日=6
    now=datetime.datetime.now()
    weekday=now.isoweekday()
    执行本小时=工作日,以周中的天为单位\
    现在,一小时又一小时\
    现在。分钟<最大(分钟)
    如果在这一小时内执行:
    下一分钟=分钟([分钟对分钟,以分钟为单位
    如果分钟>现在。分钟])
    立即返回+dr.relativedelta(分钟=下一分钟,
    秒=0,
    微秒=0)
    其他:
    下一分钟=分钟(分钟)
    今天执行=每周第天的工作日\
    和(now.hour现在,则以小时表示小时])
    立即返回+dr.relativedelta(小时=下一个小时,
    分钟=下一分钟,
    秒=0,
    微秒=0)
    其他:
    下一小时=分钟(小时)
    下一天=分钟([如果天>工作日,则以天为单位,以天为单位]\
    或一周中的天)
    立即返回+dr.relativedelta(工作日=(下一天-1)%7,
    小时=下一个小时,
    分钟=下一分钟,
    秒=0,
    微秒=0)
    如果“名称”=“\uuuuuuuu主要”:
    每周的第天=[4]
    小时=[1,10,12,13]
    分钟=[4,14,34,51,58]
    打印下一周(分钟、小时、星期)
    
    以防有人感兴趣,这是我使用~unutbu建议开发的代码。它的主要优点是伸缩性好

    import datetime
    import dateutil.relativedelta as dr
    
    def next_ocurrance(minutes, hours, days_of_week):
        # days_of_week convention: Sunday = 0, Saturday = 6
        # dateutil convention: Monday = 0, Sunday = 6
    
        now = datetime.datetime.now()
        weekday = now.isoweekday()
        execute_this_hour = weekday in days_of_week \
                            and now.hour in hours \
                            and now.minute < max(minutes)
    
        if execute_this_hour:
            next_minute = min([minute for minute in minutes
                               if minute > now.minute])
            return now + dr.relativedelta(minute=next_minute,
                                          second=0,
                                          microsecond=0)
        else:
            next_minute = min(minutes)
    
        execute_today = weekday in day_of_week \
                        and (now.hour < max(hours) or execute_this_hour)
    
        if execute_today:
            next_hour = min([hour for hour in hours if hour > now.hour])
            return now + dr.relativedelta(hour=next_hour,
                                          minute=next_minute,
                                          second=0,
                                          microsecond=0)
        else:
            next_hour = min(hours)
            next_day = min([day for day in days_of_week if day > weekday] \
                           or days_of_week)
    
            return now + dr.relativedelta(weekday=(next_day - 1) % 7,
                                          hour=next_hour,
                                          minute=next_minute,
                                          second=0,
                                          microsecond=0)
    if __name__=='__main__':
        day_of_week = [4]
        hour = [1, 10, 12, 13]
        minute = [4, 14, 34, 51, 58]
        print next_ocurrance(minute, hour, day_of_week)
    
    导入日期时间
    将dateutil.relativedelta作为dr导入
    def下一周(分钟、小时、星期):
    #每周的天数约定:周日=0,周六=6
    #dateutil约定:周一=0,周日=6
    now=datetime.datetime.now()
    weekday=now.isoweekday()
    执行本小时=工作日,以周中的天为单位\
    现在,一小时又一小时\
    现在。分钟<最大(分钟)
    如果在这一小时内执行:
    下一分钟=分钟([分钟对分钟,以分钟为单位
    如果分钟>现在。分钟])
    立即返回+dr.relativedelta(分钟=下一分钟,
    秒=0,
    微秒=0)
    其他:
    下一分钟=分钟(分钟)
    今天执行=每周第天的工作日\
    和(now.hour现在,则以小时表示小时])
    立即返回+dr.relativedelta(小时=下一个小时,
    分钟=下一分钟,
    秒=0,
    微秒=0)
    其他:
    下一小时=分钟(小时)
    下一天=分钟([如果天>工作日,则以天为单位,以天为单位]\
    或一周中的天)
    立即返回+dr.relativedelta(工作日=(下一天-1)%7,
    小时=下一个小时,
    分钟=下一分钟,
    秒=0,
    微秒=0)
    如果“名称”=“\uuuuuuuu主要”:
    每周的第天=[4]
    小时=[1,10,12,13]
    分钟=[4,14,34,51,58]
    打印下一周(分钟、小时、星期)
    
    恐怕这是不对的。列表不需要具有相同的大小。我在问题中增加了一个例子。无论如何,感谢dateutil的建议。顺便说一句,使用您生成的contants,下一个事件将是2010-09-02 01:04:00@jbochi:数据是随机生成的。每次你运行脚本,时间都会不同。是的,我知道。我的意思是,如果分钟=[4,34,51,58],小时=[1,10,15,17,20]和一周中的一天=[1,3,5,6];考虑到当前时间,下一次发生时间为2010-09-02 01:04:00@jbochi当前位置我们可能在不同的时区。脚本的结果取决于您的计算机认为
    现在是什么时间
    。恐怕这不正确。列表不需要具有相同的大小。我在问题中增加了一个例子。谢谢你的邀请