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
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当前位置我们可能在不同的时区。脚本的结果取决于您的计算机认为现在是什么时间。恐怕这不正确。列表不需要具有相同的大小。我在问题中增加了一个例子。谢谢你的邀请