web-dev-qa-db-fra.com

En python, comment vérifier si une date est valide?

Je construis une sorte d'application web de calendrier

J'ai mis en place le formulaire suivant en 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>

L'entrée de l'utilisateur est ensuite soumise dans le serveur cherrypy

Je me demande s'il existe un moyen de vérifier si la date saisie par l'utilisateur est une date valide.

Évidemment, je pourrais écrire beaucoup de déclarations if, mais existe-t-il une fonction intégrée permettant de vérifier cela?

Merci

17
Synia

Tu pourrais essayer de faire 

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

qui élimine des choses telles que les mois> 12 heures, 23 heures, les jours fériés inexistants (le mois = 2 a un maximum de 28 ans les années non bissextiles, 29 sinon, les autres mois ont un maximum de 30 ou 31 jours) (exception ValueError sur erreur)

Vous pouvez aussi essayer de le comparer avec des limites supérieures/inférieures de santé mentale.

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

Les limites de santé supérieures et inférieures pertinentes dépendent de vos besoins.

edit: rappelez-vous que cela ne gère pas certaines dates qui peuvent ne pas être valides pour votre application (anniversaire minimum, jours fériés, en dehors des heures de fonctionnement, etc.)

22
Roman A. Taycher

Vous pouvez essayer d'utiliser datetime et gérer les exceptions pour déterminer la date valide/invalide: Exemple: 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
DhruvPathak

Utilisez datetime

par exemple. 

>>> 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
jamylak

Vous pouvez essayer d'utiliser datetime et gérer les exceptions pour décider d'une date valide/non valide:

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

donne

False
True
False
True
False

Ceci est une amélioration de une réponse de DhruvPathak et a plus de sens comme édition mais elle a été rejetée comme " Cette édition était destinée à adresser à l'auteur du message et n'a aucun sens en tant que telle écrit comme un commentaire ou une réponse. "

1

Voici une solution utilisant le temps.

heure d'importation 
 def is_date_valid (year, month, day): 
 this_date = '% d /% d /% d'% (mois, jour, année) 
 essayer:
 time.strptime (this_date, '% m /% d /% Y') 
 sauf ValueError: 
 retourne False 
 autre:
 retourne True 
1
user2863035
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
Batjigdrel bataa

La question suppose que la solution sans bibliothèques implique "un grand nombre d'instructions if", mais ce n'est pas le cas:

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])
0
anon