У мене є метод 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 грудня" За замовчуванням dateutildayfirst=False
datetutil.parser.parse()приймає занадто багато форматів часу (ви можете знайти інші приклади з неоднозначним введенням). Якщо ви хочете перевірити, що ваш внесок у форматі РРРР-ММ-DD, то 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, а для зберігання / db зберігати все в UTC .
Це найпростіший спосіб:
date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')