В python, как проверить, действительна ли дата?
Я создаю своего рода веб-приложение с каландром
Я создал в HTML
следующую форму:
<form action='/event' method='post'>
Year ("yyyy"): <input type='text' name='year' />
Month ("mm"): <input type='text' name='month' />
Day ("dd"): <input type='text' name='day' />
Hour ("hh"): <input type='text' name='hour' />
Description: <input type='text' name='info' />
<input type='submit' name='submit' value='Submit'/>
</form>
Ввод пользователя затем отправляется на сервер cherrypy
Мне интересно, есть ли способ проверить, является ли дата, введенная пользователем допустимой датой?
Очевидно, я мог бы написать множество операторов if, но есть ли встроенная функция, которая может проверить это?
Спасибо
Ответы
Ответ 1
Вы можете попробовать сделать
import datetime
datetime.datetime(year=year,month=month,day=day,hour=hour)
что позволит устранить somethings, как месяцы > 12, часы > 23, несуществующие leapdays (месяц = 2 имеет максимум 28 в не високосный год, 29 в противном случае, другие месяцы имеют максимум 30 или 31 день) (генерирует исключение ValueError по ошибке)
Кроме того, вы можете попытаться сравнить его с некоторыми верхними/нижними границами здравомыслия.
например:.
datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now()
Соответствующие верхние и нижние границы здравомыслия зависят от ваших потребностей.
edit: помните, что это не обрабатывает определенные даты, которые могут быть недействительны для вашего приложения (минимальный день рождения, праздники, вне рабочего времени и т.д.)
Ответ 2
Вы можете попробовать использовать datetime и обрабатывать исключения для принятия правильной/недействительной даты:
Пример: http://codepad.org/XRSYeIJJ
import datetime
correctDate = None
try:
newDate = datetime.datetime(2008,11,42)
correctDate = True
except ValueError:
correctDate = False
print(str(correctDate))
Ответ 3
Используйте datetime
например.
>>> from datetime import datetime
>>> print datetime(2008,12,2)
2008-12-02 00:00:00
>>> print datetime(2008,13,2)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
print datetime(2008,13,2)
ValueError: month must be in 1..12
Ответ 4
Вот решение, использующее время.
import time
def is_date_valid(year, month, day):
this_date = '%d/%d/%d' % (month, day, year)
try:
time.strptime(this_date, '%m/%d/%Y')
except ValueError:
return False
else:
return True
Ответ 5
Вы можете попытаться использовать datetime и обработать исключения, чтобы определить допустимую/недействительную дату:
import datetime
def check_date(year, month, day):
correctDate = None
try:
newDate = datetime.datetime(year, month, day)
correctDate = True
except ValueError:
correctDate = False
return correctDate
#handles obvious problems
print(str(check_date(2008,11,42)))
#handles leap days
print(str(check_date(2016,2,29)))
print(str(check_date(2017,2,29)))
#handles also standard month length
print(str(check_date(2016,3,31)))
print(str(check_date(2016,4,31)))
дает
False
True
False
True
False
Это улучшение ответа DhruvPathak и имеет больше смысла в качестве редактирования, но оно было отклонено как "Это редактирование был предназначен для того, чтобы обратиться к автору сообщения и не имеет смысла в качестве редактирования. Он должен был быть написан как комментарий или ответ."
Ответ 6
Итак, вот мое хакерское решение для исправления недействительных дат. Это предполагает, что пользователь отправляется из общей html-формы, которая предоставляет дни 1-31 в качестве параметров. Основная проблема заключается в том, что пользователи предоставляют день, который не существует в течение месяца (с 31 сентября)
def sane_date(year, month, day):
# Calculate the last date of the given month
nextmonth = datetime.date(year, month, 1) + datetime.timedelta(days=35)
lastday = nextmonth.replace(day=1) - datetime.timedelta(days=1)
return datetime.date(year, month, min(day, lastday.day))
class tests(unittest.TestCase):
def test_sane_date(self):
""" Test our sane_date() method"""
self.assertEquals(sane_date(2000,9,31), datetime.date(2000,9,30))
self.assertEquals(sane_date(2000,2,31), datetime.date(2000,2,29))
self.assertEquals(sane_date(2000,1,15), datetime.date(2000,1,15))