如何在python中验证日期字符串格式?

我有一个python方法接受日期输入作为字符串。

如何添加验证以确保传递给方法的日期字符串位于ffg中。 格式:

'YYYY-MM-DD'

如果不是,方法应该引发某种错误

codemickeycode asked 2019-08-07T23:09:15Z
5个解决方案
156 votes
>>> 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
jamylak answered 2019-08-07T23:09:21Z
52 votes

Python parse库是为此而设计的(以及更多)。 它将自动将此转换为parse对象,如果不能,则提高dayfirst

举个例子:

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

如果日期格式不正确,则会引发parse

>>> 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

parse在将来开始需要解析其他格式时也非常有用,因为它可以智能地处理大多数已知格式并允许您修改规范:parse解析示例。

如果您需要,它还可以处理时区。

基于评论的更新: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
Jacinda answered 2019-08-07T23:10:16Z
19 votes

我认为完整的验证功能应如下所示:

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方法不会检查月份的月份和日期是零填充的十进制数字。 例如

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

将被执行而没有错误。

Eduard Stepanov answered 2019-08-07T23:11:02Z
15 votes
from datetime import datetime

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

..如果它收到不兼容的格式,则会引发ValueError

..如果您经常处理日期和时间(在日期时间对象的意义上,而不是unix时间戳浮点数),那么查看pytz模块和存储/数据库是一个好主意 ,以UTC保存所有内容。

Mr. B answered 2019-08-07T23:11:34Z
-4 votes

这是最简单的方法:

date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
TimorEranAV answered 2019-08-07T23:11:53Z
translate from https://stackoverflow.com:/questions/16870663/how-do-i-validate-a-date-string-format-in-python