Python:给定日期和工作日查找给定工作日下一次出现的日期

时间:2012-01-03 04:52:14

标签: python datetime timedelta

这有点难以解释,所以如果这没有多大意义,我会道歉。

我有一个程序,我正在做一些调度。其中一个设置是在某些日子每周运行一个任务。例如,每周一,周三和周五。

考虑当前任务安排在1/2/2012(即星期一)的示例,我已经有一堆代码工作到我知道下一个任务运行的时间应该是在星期三之后1 / 2/2012。我需要做的就是计算周三(2012年4月1日)的实际日期。

我实际上将星期几作为date.weekday()的相应整数,所以在这种情况下我有2代表星期三。

处理这样的事情最好的方法是什么?我觉得应该有一个相当简单的解决方案,但它不会浮现在脑海中。我正在考虑使用日历对象进行搜索以查找我想要的一周中的某一天,但这似乎有些过分。

4 个答案:

答案 0 :(得分:13)

使用dateutil.relativedelta

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

答案 1 :(得分:8)

使用timedelta添加日期。例如,使用某个日期d作为当前任务的预定日期,并使用某天next_day(下一个您想要运行任务)。< / p>

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)

答案 2 :(得分:0)

我们知道:

  • 星期一星期三,有两天的差异。
  • 星期三星期五,有两天的差异。
  • 星期五星期一,有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

答案 3 :(得分:0)

使用dateutil来处理计划和重复。