【メモ】Pythonで日付の入力・日付妥当性チェックを行うやり方

Pythonで日付の入力をした際、「そんな日付がちゃんと存在しているのか」妥当性チェックを行いたいことがあったため、そのやり方をメモ。

調べた感じいくつかやり方がありましたが、簡単そうなのが以下だったためこれを参考に。

底辺情報系学生の雑記。プログラミングTIPSとか日々の雑記その他。ゆっくりしていってね。…

※try文がわからない人は以下を参照。

元記事だけだと判定結果がわかりづらいこと、日付が妥当だった場合の処理が書きにくかったためif文で条件分岐などもさせました。

以下そのままコピペして実行すれば使えるかと思います。

from calendar import day_abbr
import datetime
def checkDate(year,month,day):
    try:
        newDataStr="%04d/%02d/%02d"%(year,month,day)
        newDate=datetime.datetime.strptime(newDataStr,"%Y/%m/%d")
        return True
    except ValueError:
        return False


year=int(input("西暦を入力してください。"))
month=int(input("月を入力してください。"))
day=int(input("日を入力してください。"))

bool=checkDate(year,month,day)

if bool==True:
    hiduke=str(year)+"/"+str(month)+"/"+str(day)
    print("この日は存在します。")
    print("この日は"+hiduke+"です。")
else:
    print("この年月日は存在しません。")

 

上記を実行した結果が以下になります。

※~を入力してくださいの後ろにある数字はinput()での入力です。

西暦を入力してください。2022
月を入力してください。8
日を入力してください。3
この日は存在します。
この日は2022/8/3です。

 

ちなみにコマンドライン引数でやる場合はこんな感じです。

from calendar import day_abbr
import datetime
import sys


def checkDate(year,month,day):
    try:
        newDataStr="%04d/%02d/%02d"%(year,month,day)
        newDate=datetime.datetime.strptime(newDataStr,"%Y/%m/%d")
        return True
    except ValueError:
        return False


args = sys.argv


year=int(args[1])
month=int(args[2])
day=int(args[3])


bool=checkDate(year,month,day)


if bool==True:
    hiduke=str(year)+"/"+str(month)+"/"+str(day)
    print("この日は存在します。")
    print("この日は"+hiduke+"です。")
else:
    print("この年月日は存在しません。")

以下が結果。

この日は存在します。
この日は2022/8/3です。
Qiita

コマンドライン引数受け取ってそれを処理する問題が出たときに、そういえば、Pythonでコマンドライン引数受け取るのやった…