У меня есть метод 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
источник
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 .
источник
Это самый простой способ:
date = datetime.now() date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')
источник