Outils pour utilisateurs

Outils du site


verifdate

Vérification de validité d'une date

Objectif

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

Solution proposée

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!

verifdate.txt · Dernière modification: 2009/04/23 09:03 de tyrtamos

Outils de la page