週の始めに週報をメール配信するよう指示されています。
if jpholiday.is_holiday(today)==True: sys.exit() ... if today.weekday()==0 or today.weekday()==1 and jpholiday.is_holiday(today+datetime.timedelta(days=-1))==True: 実行
これくらいでほぼ事足りるとは思いますが、これだとGWなどの連休明けの水曜や木曜日に配信されないことになります。
「連休明けの水/木曜日だ」というのをさらなるif文の追加やif文で判定したり、
水曜、木曜だけど実行する日のリストを用意する、
のではない何かスマートな方法がありますでしょうか。
なければ「休み関係なくとにかく月曜に配信」とするか、連休中はマシンをOFFし、例外の日は手動でプログラムを回す方が安全かと思っています。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/21 22:45
2020/11/21 23:45
2020/11/21 23:54
回答3件
0
メルマガ(?)配信のために、連休「明け」を判定したいってことなんですかね?
もっと愚直に「連休明け」をデータとして持ってしまうってのも一つのやり方かと。
配信条件は、「月曜で休日ではない日」か「連休明けの日」の条件で定義できるようになります。
投稿2020/11/21 23:18
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
jpholidayを利用した回答。
Python
1import datetime 2import jpholiday 3 4 5def get_first_weekday_date(base_date): 6 monday = base_date - datetime.timedelta(days=base_date.weekday()) 7 for i in range(7): 8 dt = monday + datetime.timedelta(days=i) 9 if jpholiday.is_holiday(dt): 10 # print(f"skipped {dt} {jpholiday.is_holiday_name(dt)}") 11 continue 12 return dt 13 return None # 一週間全部holidayの場合 14 15 16today = datetime.date.today() 17# today = datetime.date(2020, 5, 5) # 試験用 18 19target_date = get_first_weekday_date(today) 20 21print(target_date) 22if target_date == today: 23 print("今がその時だ♪")
投稿2020/11/22 00:15
編集2020/11/22 00:15総合スコア11990
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/24 03:21 編集
0
もはや作ってしまった方が早いです。
jpholidayはメンテはされているようですが、一般的に使うライブラリである、という感じはうけません。また特別休日の追加はできるようなのですが、ベースとなる休日を削除はできなさそうなので、質問者の会社が「来週の月曜振替休日は年間の調整で出勤日にします!」みたいな状況には対応できないかもです。
また、最初は面倒ですが、このように作っておくことで、以下メリットがあると思います。
- 来年の予定の登録や、今年の日程の修正が必要になった際に、登録がやりやすい(会社の休日一覧表とか、自分の年休日とかをそのまま登録すればよく、何か変更して別の日を登録するといった、登録に頭を悩ませることは不要)
- 今後「週報の暫定版を、休日では無い週末に提出せよ!」みたいな別の要件が発生した場合に拡張がしやすい
データを、外側でファイル定義するとかは、もはや応用なので、ご自分でカスタマイズしてみてください。terateilはプログラマーの問題解決の場ですので、「完成されて後はコード見なくてもOK!といった回答」ではなく、「質問者様のコードに組み込んでどんどん拡張していただける元となる回答」を心がけました。
Python
1class MyDateTime: 2 # Prioritize upper set of days, ignore lower duplicated elements. 3 # Of courese, you must register the future calendars, 4 # in odrder not to work on many days! :-) 5 special_workdays = {} 6 special_holidays = { 7 '2020-1-2', '2020-1-3', '2020-8-11', '2020-8-12', '2020-8-13', '2020-8-14', 8 '2020-12-29', '2020-12-30', '2020-12-31' 9 } 10 national_holidays = { 11 '2020-1-1', '2020-1-13', '2020-2-11', '2020-2-23', '2020-2-24', 12 '2020-3-20', '2020-4-29', '2020-5-3', '2020-5-4', '2020-5-5', '2020-5-6', 13 '2020-7-23', '2020-7-24', '2020-8-10', '2020-9-21', '2020-9-22', 14 '2020-11-3', '2020-11-23' 15 } 16 17 @classmethod 18 def strptime(cls, s): 19 tdatetime = datetime.datetime.strptime(s, '%Y-%m-%d') 20 return datetime.date(tdatetime.year, tdatetime.month, tdatetime.day) 21 22 @classmethod 23 def is_workday(cls, day): 24 if day in map(cls.strptime, cls.special_workdays): 25 return True 26 if day in map(cls.strptime, cls.special_holidays): 27 return False 28 if day in map(cls.strptime, cls.national_holidays): 29 return False 30 return not (day.weekday() == 5 or day.weekday() == 6) 31 32 @classmethod 33 def is_holiday(cls, day): 34 return not cls.is_workday(day) 35 36 @classmethod 37 def is_sad_day(cls, day): # the 1st workday of the week 38 for i in range(day.weekday()): 39 if cls.is_workday(day - datetime.timedelta(days=day.weekday()-i)): 40 return False 41 return cls.is_workday(day) 42 43for day in ['2020-11-21', '2020-11-22', '2020-11-23', '2020-11-24', '2020-11-25']: 44 print(day, '= sad day?', MyDateTime.is_sad_day(MyDateTime.strptime(day))) 45 46#2020-11-21 = sad day? False 47#2020-11-22 = sad day? False 48#2020-11-23 = sad day? False 49#2020-11-24 = sad day? True 50#2020-11-25 = sad day? False
投稿2020/11/21 23:58
編集2020/11/22 01:22総合スコア3266
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/22 01:02 編集
2020/11/22 00:28
2020/11/22 00:39
2020/11/22 00:49
2020/11/22 01:06
2020/11/22 01:49 編集
2020/11/22 14:59
2020/11/22 15:41 編集
2020/11/23 00:40 編集
退会済みユーザー
2020/11/23 07:04 編集
2020/11/23 07:58 編集
2020/11/23 08:03
2020/11/24 01:09
2020/11/24 03:57 編集
2020/11/24 04:12
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。