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
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.)
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))
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
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)))
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. "
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
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>")
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])