问题:如何验证python中的日期字符串格式?
我有一个python方法,它接受日期输入作为字符串。
如何添加验证以确保传递给方法的日期字符串在ffg中。格式:
'YYYY-MM-DD'
如果不是,则方法应该引发某种错误
回答 0
>>> 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
回答 1
在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
回答 2
我认为完整的验证功能应如下所示:
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')
将被执行而没有错误。
回答 3
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
ValueError
..如果收到不兼容的格式,则会引发a 。
..如果您要处理大量的日期和时间(就日期时间对象而言,而不是unix时间戳浮动),那么最好查看pytz模块,对于storage / db,将所有内容存储在UTC中。
回答 4
这是最简单的方法:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')