IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Pbm Verification date


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 19
    Points : 12
    Points
    12
    Par défaut Pbm Verification date
    Bonjour,

    j'ai un petit souci avec mon programme.
    Je saisie une date de type string et je voudrais verifier qu'elle soit correcte en fonction des mois ( eviter d'avoir kke chose comme 31/02/09 par exemple )

    j'ai essayé de convertir ma string en date avec la fonction strftime et ca marche pas
    j'ai essayé avec le code ci dessous et il y a aussi des bugs. Ca fait des heures que je suis bloquée sur ce pbm et du coup j'ai plus d'idee. Si quelqu'un pouvait m'aider. Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #### Date d'Envoi ####
        print "La date d'envoi (JJ/MM/AA) : "
        date = raw_input()
        print date
     
        while(len(date) <> 8):
            print "Veuillez respecter les 8 caracteres demandes"
            print "La date d'envoi (JJ/MM/AA) : "
            date = raw_input()
        else:
            while(date[2] <> '/' or date[5] <> '/'):
                #controle des nombres jours et mois
                print "Veuillez respecter le format date JJ/MM/AA requis"
                print "La date d'envoi (JJ/MM/AA) : "
                date = raw_input()
            else:
                # verifier la saisie de chiffres
                jour = int(date[:2])
                mois = int(date[3:5])
                annee = int(date[6:])
     
                while mois > 13 or mois < 0:
                    print "Erreur: Mois Invalide"
                    date = raw_input()
                if mois in (1, 3, 5, 7, 8, 10, 12):
                    while jour > 31:
                        print "Erreur: Le jour ne peut contenir que 31 jours."
                        print "Veuillez resaisir le jour: "
                        date = raw_input()
                elif mois == 2:
                    if annee % 4 == 0:
                        while jour > 30:
                            print "Erreur: Le jour ne peut contenir que 29 jours."
                            print "Veuillez resaisir le jour: "
                            jour = raw_input()
                    else:
                        while jour > 29:
                            print "Erreur: Le jour ne peut contenir que 28 jours."
                            date = raw_input()
                else:
                    while jour > 31:
                        print "Erreur: Le jour ne peut contenir que 30 jours."
                        date = raw_input()

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a peut-être une fonction dans un module python, mais voilà ce que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    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(D):
        """verifdate(j,m,a): vérifie si une date j,m,a est valide (True=oui, False=non)"""
        L = D.split('/')
        j, m, a = int(L[0]), int(L[1]), int(L[2]) 
        if a<100:
            a += 1900
            if a<1950:
                a += 100
        if a<1950 or a>2049 or m<1 or m>12 or j<1:
            return False
        if bissextile(a):
            if j>(31,29,31,30,31,30,31,31,30,31,30,31)[m-1]:
                return False
        else:
            if j>(31,28,31,30,31,30,31,31,30,31,30,31)[m-1]:
                return False
        return True
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    x = "28/2/09"
    print verifdate(x)
    True
     
    x = "29/2/09"
    print verifdate(x)
    False
    Valable pour des années de 1950 à 2049 (c'est modifiable).

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Ta question a été l'occasion de m'apercevoir que strptime() vérifie la conformité de la date qu'on lui passe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    >>> from time import strptime
    >>> print strptime('05/64/08','%d/%m/%y')
     
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        print strptime('05/64/08','%d/%m/%y')
      File "C:\Python25\lib\_strptime.py", line 330, in strptime
        (data_string, format))
    ValueError: time data did not match format:  data=05/64/08  fmt=%d/%m/%y
    >>> print strptime('30/02/08','%d/%m/%y')
     
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        print strptime('30/02/08','%d/%m/%y')
      File "C:\Python25\lib\_strptime.py", line 440, in strptime
        datetime_date(year, 1, 1).toordinal() + 1
    ValueError: day is out of range for month
    >>> print strptime('29/02/08','%d/%m/%y')
    (2008, 2, 29, 0, 0, 0, 4, 60, -1)
    >>> print strptime('30/02/09','%d/%m/%y')
     
    Traceback (most recent call last):
      File "<pyshell#4>", line 1, in <module>
        print strptime('30/02/09','%d/%m/%y')
      File "C:\Python25\lib\_strptime.py", line 440, in strptime
        datetime_date(year, 1, 1).toordinal() + 1
    ValueError: day is out of range for month
    >>> print strptime('29/02/09','%d/%m/%y')
     
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
        print strptime('29/02/09','%d/%m/%y')
      File "C:\Python25\lib\_strptime.py", line 440, in strptime
        datetime_date(year, 1, 1).toordinal() + 1
    ValueError: day is out of range for month
    >>> print strptime('28/02/09','%d/%m/%y')
    (2009, 2, 28, 0, 0, 0, 5, 59, -1)
    >>>
    Ça m'a aussi été l'occasion de voir qu'il y a une fonction isleap( year)
    dans le module calendar qui envoie True ou False selon que year est bissextile ou non.

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    J'ai complété un peu ma solution. Elle est ici:

    http://python.jpvweb.com/mesrecettespython/verifdate

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. [XL-2010] Verification date non dupliquee
    Par FFGUY dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/09/2014, 11h38
  2. Pbm champ date vide
    Par HASSIOMAR dans le forum Débuter
    Réponses: 1
    Dernier message: 05/03/2009, 10h27
  3. verification date avec affichage image
    Par MortDansLAme dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 16/03/2008, 11h28
  4. [oracle 9i ] verification date
    Par jejam dans le forum Oracle
    Réponses: 2
    Dernier message: 20/10/2005, 11h44
  5. [Utile]Rajout automatique dans input et verif date
    Par matpal dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/11/2004, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo