В Python, как проверить, является ли дата действительной? - PullRequest
19 голосов
/ 03 апреля 2012

Я создаю своего рода веб-приложение с календарем

Я установил следующую форму в 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, но есть ли встроенная функция, которая может это проверить?

Спасибо

Ответы [ 8 ]

22 голосов
/ 03 апреля 2012

Вы можете попробовать использовать 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))
22 голосов
/ 03 апреля 2012

Вы можете попробовать сделать

import datetime
datetime.datetime(year=year,month=month,day=day,hour=hour)

, что устранит некоторые вещи, такие как месяцы> 12, часы> 23, несуществующие високосные дни (месяц = ​​2 имеет максимум 28 для не високосных лет, 29 в противном случае, другие месяцы имеют максимум 30 или 31 день) (выдает исключение ValueError при ошибке)

Также вы можете попытаться сравнить это с некоторыми верхними / нижними границами здравомыслия. ex.:

datetime.date(year=2000, month=1,day=1) < datetime.datetime(year=year,month=month,day=day,hour=hour) <= datetime.datetime.now()

Соответствующие верхние и нижние границы вменяемости зависят от ваших потребностей.

edit: помните, что это не относится к определенным датам и вещам, которые могут быть недопустимыми для вашего приложения (мин. День рождения, праздничные дни, нерабочее время и т. Д.)

4 голосов
/ 03 апреля 2012

Использование 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
1 голос
/ 23 августа 2018

Вопрос предполагает, что решение без библиотек включает в себя «много операторов if», но это не так:

def is_valid_date(year, month, day):
    day_count_for_month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if year%4==0 and (year%100 != 0 or year%400==0):
        day_count_for_month[2] = 29
    return (1 <= month <= 12 and 1 <= day <= day_count_for_month[month])
1 голос
/ 06 марта 2016

Вы можете попробовать использовать 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 и имеет больше смысла как редактирование, но было отклонено как " Это редактирование предназначалось для обращения к автору поста и не имеет смысла как редактирование. Это должно было бытьнаписано как комментарий или ответ."

1 голос
/ 02 декабря 2015

Вот решение, использующее время.

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
0 голосов
/ 14 сентября 2018
y = int(input("Year: "))
m = int(input("Month: "))
d = int(input("Day: "))

if 0 <= y and 0 < m < 13 and 0 < d < 32: #Check whether date is under limit.

    if y % 4 == 0: # Every 4 year "Leap" year occures so checking...
        if m == 2: # In "Leap" year February has 29 days
            if d < 30:
                print("<Correct>")
            else:
                print("<Wrong>")

    elif m == 2: # But if it's not "Leap" year February will have 28 days
        if d < 29:
            print("<Correct>")
        else:
            print("<Wrong>")
    elif y % 4 != 0 and m != 2: # Otherwise print "Correct"
        print("<Correct>")

else:
    print("<Wrong>")
0 голосов
/ 10 октября 2014

Итак, вот мое хакерское решение по исправлению недопустимых дат. Это предполагает, что пользователь отправляет из общей 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...