Dans un programme, on introduit une date: comment vérifier que cette date est une date valide, c'est à dire qu'elle n'est pas “29/2/2009” ou “31/9/2009” ou “15/13/1987” (etc…)?
Voilà le code proposé. Il est autodocumenté:
1er cas: la date est introduite sous forme de chaine de caractère “j/m/a”
⇒ on appelle la fonction verifdatechaine(D, sep='/')
2ème cas: la date est introduite sous forme de nombres entiers j,m,a
⇒ on appelle la fonction verifdate(j,m,a)
En ce qui concerne les années, on peut les introduire sous forme raccourcie, par exemple 87 pour 1987. Dans ce cas, entre 0 et 49 ⇒ on ajoute 2000, et entre 50 et 99 ⇒ on ajoute 1900. Ce qui fait que les années acceptables sont supérieures ou égales à 100.
def bissextile(an): """_bissextile(an): dit si l'année donnée est bissextile ou non (True=oui, False=non)""" if (an % 4)==0: if ((an % 100)==0) and ((an % 400)<>0): return False else: return True else: return False def verifdate(j,m,a): """verifdate(j,m,a): vérifie si une date j, m, a (avec a=aa ou aaaa) est valide (True=oui, False=non)""" # correction éventuelle si l'annee est donnée sous forme raccourcis (ex: '09' ald '2009') if a<100: if a<0: return False # rejet d'une annee negative if a<50: a += 2000 # si a est entre 0 et 49 => entre 2000 et 2049 else: a += 1900 # si a est entre 50 et 99 => entre 1950 et 1999 # si on arrive ici, l'annee est >=100 # detection des erreurs de dates if m<1 or m>12 or j<1: return False if j>(31,29,31,30,31,30,31,31,30,31,30,31)[m-1]: return False if (not bissextile(a)) and m==2 and j>28: return False # si on arrive jusqu'ici, la date est ok! return True def verifdatechaine(D, sep='/'): """verifdate(D): vérifie si une date D="j/m/a" (avec a="aa" ou "aaaa") est valide (True=oui, False=non)""" # verif que D est bien une chaine de caractere if type(D)!= str and type(D)!=unicode: return False L = D.split(sep) # verif que la date chaine comporte bien 2 séparateurs ('/' par defaut) if len(L)!=3: return False # recup des j, m et a sous forme de nbs entiers si c'est possible (sinon => la date n'est pas valide) try: j, m, a = int(L[0]), int(L[1]), int(L[2]) except: return False return verifdate(j,m,a) # =====> exemples d'utilisation V = ["12/5", "1x/5/78", "28/2/09", "29/2/09", "28/2/2009"] for D in V: print verifdatechaine(D) """ Ce qui affiche: False False True False True """
Amusez-vous bien!