web-dev-qa-db-ja.com

Pythonで日付文字列形式を検証するにはどうすればよいですか?

文字列としての日付入力を受け入れるpythonメソッドがあります。

メソッドに渡される日付文字列がffgにあることを確認する検証を追加するにはどうすればよいですか。フォーマット:

'YYYY-MM-DD'

そうでない場合、メソッドは何らかのエラーを発生させる必要があります

101
codemickeycode
>>> import datetime
>>> def validate(date_text):
    try:
        datetime.datetime.strptime(date_text, '%Y-%m-%d')
    except ValueError:
        raise ValueError("Incorrect data format, should be YYYY-MM-DD")


>>> validate('2003-12-23')
>>> validate('2003-12-32')

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    validate('2003-12-32')
  File "<pyshell#18>", line 5, in validate
    raise ValueError("Incorrect data format, should be YYYY-MM-DD")
ValueError: Incorrect data format, should be YYYY-MM-DD
161
jamylak

Python dateutil ライブラリはこのために設計されています(その他)。これを自動的にdatetimeオブジェクトに変換し、できない場合はValueErrorを発生させます。

例として:

>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)

日付が正しくフォーマットされていない場合、これはValueErrorを発生させます。

>>> parse("2003-09-251")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

dateutilは、将来、他の形式を解析する必要がある場合にも非常に便利です。ほとんどの既知の形式をインテリジェントに処理でき、仕様を変更できるためです。 dateutil解析例

必要に応じてタイムゾーンも処理します。

コメントに基づく更新parseは、日付があいまいな場合に日または月が最初に来るかどうかを制御するキーワード引数dayfirstも受け入れます。デフォルトはFalseです。例えば。

>>> parse('11/12/2001')
>>> datetime.datetime(2001, 11, 12, 0, 0) # Nov 12
>>> parse('11/12/2001', dayfirst=True)
>>> datetime.datetime(2001, 12, 11, 0, 0) # Dec 11
53
Jacinda

完全な検証機能は次のようになります。

from datetime import datetime

def validate(date_text):
    try:
        if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
            raise ValueError
        return True
    except ValueError:
        return False

ただ実行する

datetime.strptime(date_text, "%Y-%m-%d") 

strptimeメソッドは月と日がゼロで埋められた10進数であることをチェックしないため、十分ではありません。例えば

datetime.strptime("2016-5-3", '%Y-%m-%d')

エラーなしで実行されます。

21
Eduard Stepanov
from datetime import datetime

datetime.strptime(date_string, "%Y-%m-%d")

..互換性のない形式を受け取った場合、これはValueErrorを発生させます。

..日付と時刻を頻繁に処理する場合(Unixタイムスタンプフロートとは対照的に、datetimeオブジェクトの意味で)、pytzモジュールを調べ、storage/dbの場合はすべてをUTCで保存することをお勧めします。

15
Mr. B