У меня есть метод python, который принимает ввод даты как строку.
Как добавить подтверждение, чтобы строка даты передавалась методу в ffg. Формат:
'YYYY-MM-DD'
Если это не так, метод должен вызвать некоторую ошибку
У меня есть метод python, который принимает ввод даты как строку.
Как добавить подтверждение, чтобы строка даты передавалась методу в 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)
Возникает 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
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
.. это вызывает a ValueError
, если он получает несовместимый формат.
.. Если вы имеете дело с датами и временем много (в смысле объектов datetime, в отличие от пометки timestamp unix), неплохо заглянуть в модуль pytz, а для хранения /db - хранить все в UTC.
Я думаю, что полная функция проверки должна выглядеть так:
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')