C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

日付を判断する

こちらで使った文字を日付として判断するis_date関数の
お話です。
Fletのテキストフィールドでのバリデーション2 - C#ATIA

必要だったため、もうちょっと改修します。

datetime.strptimeメソッドの場合、

        '2023-05-22'

は日付として変換出来ますが、

        '2023/05/22'
        '2023年05月22日'

に関しては日付とはしてくれません。想定している利用方法は
手で入力する事は少ないのですが、手で修正を許しているので
これらを許可しないと不便です。

その為、関数を修正しました。

def is_date(txt: str) -> bool:
    try:
        pattern = r'(\d+)([年/-])(\d+)([月/-])(\d+)(日)?'
        res = re.findall(pattern, txt)

        if len(res) != 1: return False
        if len(res[0]) != 6: return False

        word = f'{res[0][0]}-{res[0][2]}-{res[0][4]}'
        datetime.strptime(word, "%Y-%m-%d")

        return True
    except:
        return False

if __name__ == '__main__':

    txts = [
        '2023-05-22',
        '2023/05/22',
        '2023年05月22日',
        '20230522',
        '2023-02-30',
        '12023-05-22',
        '2023-13-22',
    ]

    for txt in txts:
        print(f'{txt}:{is_date(txt)}')

結果はこちらです。

2023-05-22:True
2023/05/22:True
2023年05月22日:True
20230522:False
2023-02-30:False
12023-05-22:False
2023-13-22:False

正規表現のパターンを検索したのですが、以外にもズバリのものが
見つからなかったので作ったのですが、苦労しました・・・。

実際には

2023年05-22/

と言うおかしい表記でも日付として判断してしまっているのですが、
これ以上は思い付きませんでした・・・。