本記事(記事カラム)には広告が含まれています。

12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示する|Python 練習 18-2

記事内に広告が含まれています。

tkinter で 年月を入力して12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示します。

DMM FX広告(差し込みタイプ)
広告(PR)|自分の投資スタイルを見つける。※タップで開閉
広告(PR)

DMM FXは、「最初の一歩を踏み出す場」として選ばれることがある

口座を開いてみた。取引してみた。思ったよりも難しかった。──そんな経験が、投資との距離感を知るきっかけになることもあります。


サービスを通じて、自分の投資スタイルを見つける。それは、確信ではなくても構いません。「試してみた」という実感が、次の選択の材料になることもあるからです。


DMM FXに関する詳細は、以下の広告(PR)リンクをご覧いただけます。


👇こちらは広告(PR)リンクバナーです

DMMFX

実際に書いたコード

【試してみる際のお願い】

  • プログラミングは、お使いのパソコンの環境(OSやアプリのバージョン)によって、同じコードでもエラーが出るケースがよくあります。
  • 外部での実行や利用を想定して作られていないため、万が一、動作を試されたことにより不具合等の損害が生じても、当方は一切の責任を負いかねます。
  • 自分用のメモにつき、質問やバグ修正などの個別サポートは一切行っておりません。試す場合は完全な自己責任でお願いいたします。
# 12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示する
import tkinter as tk
from datetime import datetime, timedelta


def show_day():
    year = year_entry.get()
    month = month_entry.get()
    day = "12"

    # 入力が数字がどうかチェック
    if not (year.isdigit() and month.isdigit() and day.isdigit()):
        result_label.config(text="数字を入力してください")
        return

    try:
        y = int(year)
        m = int(month)
        d = int(day)
        dt = datetime(y, m, d)
    except ValueError:
        result_label.config(text="存在しない年月です")
        return

    # 12日を含む週が終わってから3回目の金曜日が翌月の何日かを計算
    weekday_sunday0 = dt.isoweekday() % 7  # 日曜日=0 に変換
    friday = d + 5 - weekday_sunday0  # 12日を含む週の金曜日
    friday_3 = datetime(y, m, friday) + timedelta(
        days=21
    )  # 12日を含む週の金曜日から3週間後

    result_label.config(text=f"{friday_3.day}日")


# --- GUI構築 ---
root = tk.Tk()
root.title("12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示")
root.geometry("600x200")

tk.Label(root, text="年").pack()
year_entry = tk.Entry(root)
year_entry.pack()

tk.Label(root, text="月").pack()
month_entry = tk.Entry(root)
month_entry.pack()

tk.Button(
    root,
    text="12日を含む週が終わってから3回目の金曜日が翌月の何日かを表示",
    command=show_day,
).pack()

result_label = tk.Label(root, text="")
result_label.pack()

root.mainloop()

解説

from datetime import datetime, timedelta

datetime モジュールの datetime クラスと timedelta クラスを使うのでインポートしています。

12日を含む週が終わってから3回目の金曜日が翌月の何日かを計算

①12日が週のどこにあるかを「日曜=0」で求める

weekday_sunday0 = dt.isoweekday() % 7  # 日曜日=0 に変換

dt.isoweekday()月曜=1〜日曜=7 の番号を返します。

「週の基準を日曜=0」にしたいので、 7 で割った余りにすることで 日曜=0, 月曜=1, …, 土曜=6 に変換します。

参考記事(年月を入力して12日を含む週の金曜日が何日かを表示する|Python 練習 18-1)では、下記で計算していました。

weekday_sunday0 = (dt.weekday() + 1) % 7  # 日曜日=0 に変換

今回は、isoweekday()を使うことでシンプルにしてみました。

isoweekday() % 7 の技は、Xで教えてもらいました。

② 12日を含む週の金曜日を求める

friday = d + 5 - weekday_sunday0

「日曜=0」を基準にすると、 金曜は週の 5 番目(日曜0 → 金曜5)

③ 金曜日から 3 週間(21日)後を求める

friday_3 = datetime(y, m, friday) + timedelta(days=21)
  • 金曜日は 7 日周期なので 3 回目の金曜日 = 21 日後(7×3)
  • datetime が月またぎを自動処理します

④ 翌月の「何日か」だけを取り出す

result_label.config(text=f"{friday_3.day}日")
  • friday_3.day日付の「日」だけ
  • 月は自動で繰り上がっているので、翌月の「何日か」が正しく表示されます

⑤前提条件の確認

コードでは、「12日を含む週が終わってから3回目の金曜日は、必ず翌月になる」ということを前提条件としています。

確認:

12日が日曜日だった場合、金曜日は17日、3回目の金曜日=17日+21日=38日相当
12日が土曜日だった場合、金曜日は11日、3回目の金曜日=11日+21日=32日相当
月の日数の最大は 31 日、31日相当を必ず越えているので、翌月以降
月の日数の最小は 28 日の2倍の56日相当より必ず小さいので、今月または翌月
よって、必ず翌月になる

実行結果

Auto Py to Exe で、Windowsのexeアプリ化して、実行。

HR


人気ブログランキング