Python: 给定日期和星期几,找到下一个出现的日期
这有点难以解释,如果说得不太清楚我先道个歉。
我有一个程序在做调度,其中有一个设置是每周在特定的日子运行一个任务。比如说,每周的星期一、星期三和星期五。
举个例子,当前任务定在2012年1月2日,那天是星期一。我已经有一堆代码可以确定下一个任务应该在2012年1月2日之后的星期三,也就是2012年1月4日。我只需要计算出那个星期三的具体日期。
其实我已经有了星期几的数字表示,来自于date.weekday()这个函数,所以在这个例子中,我得到了2,代表星期三。
像这种情况最好的处理方法是什么呢?我觉得应该有一个比较简单的解决方案,但我现在想不起来。我在考虑用一个日历对象来查找我想要的星期几,但这似乎有点复杂。
4 个回答
0
我们知道:
- 从星期一到星期三之间相差2天。
- 从星期三到星期五之间相差2天。
- 从星期五到星期一之间相差3天。
所以,这其实就是把安排任务之间的天数差加起来:
from datetime import datetime, timedelta
first_scheduled_task = datetime(year=2012, month=1, day=2)
second_scheduled_task = first_scheduled_task + timedelta(2)
third_scheduled_task = second_scheduled_task + timedelta(2)
fourth_scheduled_task = third_scheduled_task + timedelta(3)
这样我们就能得到结果:
>>> first_scheduled_task
datetime.datetime(2012, 1, 2, 0, 0) # Monday 1/2/2012
>>> second_scheduled_task
datetime.datetime(2012, 1, 4, 0, 0) # Wednesday 1/4/2012
>>> third_scheduled_task
datetime.datetime(2012, 1, 6, 0, 0) # Friday 1/6/2012
>>> fourth_scheduled_task
datetime.datetime(2012, 1, 9, 0, 0) # Monday 1/9/2012
14
from dateutil import relativedelta
import datetime
today = datetime.date.today()
# datetime.date(2012, 1, 3)
today + relativedelta.relativedelta(weekday=2) # 2 is Wednesday
# datetime.date(2012, 1, 4)
today + relativedelta.relativedelta(weekday=6) # 6 is Sunday
# datetime.date(2012, 1, 8)
today + relativedelta.relativedelta(weekday=1) # 1 is Tuesday
# datetime.date(2012, 1, 3)
# returns today
today + relativedelta.relativedelta(weeks=1, weekday=1)
# datetime.date(2012, 1, 10)
# returns Tuesday at least one week ahead
8
使用一个叫做 timedelta
的东西来给日期加上时间。比如说,假设你有一个日期 d
,这是你当前任务的计划日期,还有一个日期 next_day
(就是你想要在下一个天执行这个任务的日期)。
from datetime import date, timedelta
...
n = (next_day - d.weekday()) % 7 # mod-7 ensures we don't go backward in time
next_run_date = d + timedelta(days=n)