У меня есть метод 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
Библиотека Pythondateutil предназначена для этого (и не только). Он автоматически преобразует это в 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
parse('13/12/2001')«13 декабря», но parse('11/12/2001')«12 ноября» (первый результат здесь предполагает «11 декабря»).
parseфактически принимает dayfirstаргумент ключевого слова, который позволяет вам контролировать это. parse('11/12/2001', dayfirst=True)вернет "11 дек." по умолчанию dateutil являетсяdayfirst=False
datetutil.parser.parse()принимает слишком много форматов времени (вы можете найти другие примеры с неоднозначным вводом). Если вы хотите убедиться, что введенные вами данные находятся в формате ГГГГ-ММ-ДД, parse()функция - неправильный инструмент.
.parse()вернуть строку формата в дополнение к datetimeобъекту?
Я думаю, что полная функция проверки должна выглядеть так:
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')
будет выполнено без ошибок.
datetime.strptime(date_text, "%Y-%m-%d")?
from datetime import datetime
datetime.strptime(date_string, "%Y-%m-%d")
..это вызывает ошибку, ValueErrorесли он получает несовместимый формат.
..если вы много имеете дело с датами и временем (в смысле объектов datetime, в отличие от плавающих меток времени unix), неплохо было бы заглянуть в модуль pytz, а для storage / db хранить все в UTC .