В 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))