10

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

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

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

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

处理这样的事情的最佳方法是什么?我觉得应该有一个相当简单的解决方案,但没有想到。我正在考虑使用日历对象来搜索以找到我想要的星期几,但这似乎有点矫枉过正。

4

4 回答 4

14

使用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
于 2012-01-03T08:09:05.220 回答
8

使用 atimedelta添加到日期。例如,使用某个日期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)
于 2012-01-03T05:04:01.060 回答
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
于 2012-01-03T05:06:50.533 回答
0

使用dateutil处理计划和重复。

于 2012-01-03T06:41:20.113 回答