10

これは説明するのが少し難しいので、これがあまり意味をなさない場合は申し訳ありません。

私はいくつかのスケジューリングを行っているプログラムを持っています。設定の 1 つは、毎週特定の日にタスクを実行することです。たとえば、毎週月曜日、水曜日、金曜日です。

現在のタスクが 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

a を使用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)
于 2012-01-03T05:04:01.060 に答える
0

スケジューリングと繰り返しを処理するには、 dateutilを使用します。

于 2012-01-03T06:41:20.113 に答える
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 に答える