如何在Python中validationdatestring格式?

我有一个Python方法接受dateinput作为一个string

如何添加validation以确保传递给方法的datestring在ffg中。 格式:

'YYYY-MM-DD' 

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

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

Python的dateutil库是专为这个(和更多)。 它会自动将它转换为一个datetime对象,如果它不能引发一个ValueError

举个例子:

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

如果date格式不正确,则会引发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 

如果您将来需要parsing其他格式,则dateutil也非常有用,因为它可以智能地处理大多数已知格式,并允许您修改规范: dateutilparsing示例 。

它也处理时区,如果你需要的话。

根据注释更新parse也接受关键字参数dayfirst ,它控制如果date不明确,预计date还是月份。 这个默认为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 
 from datetime import datetime datetime.strptime(date_string, "%Y-%m-%d") 

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

..如果你处理的date和时间很多(在date时间对象的意义上,而不是unix时间戳浮动),这是一个好主意,看看pytz模块,并为存储/分贝,存储所有以UTC 。

我认为完整的validationfunction应该是这样的:

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

将被执行而没有错误。

这是最简单的方法:

 date = datetime.now() date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')