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

Développement Web avec .NET Discussion :

Expression régulière contrôle de date


Sujet :

Développement Web avec .NET

  1. #1
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut Expression régulière contrôle de date
    Salut tout le monde.

    Je suis toujours aussi nul en expression régulière et j'en utilise pas assez souvent pour m'améliorer.

    Alors je viens solliciter votre gentillesse pour m'aider à pondre celle là.
    quoi que, peut-être que c'est pas possible en fait, vous me direz.

    Je pars de ça :
    ([0-9]{2,2})(/)([0-9]{2,2})(/)([0-9]{4,4})
    J'ai mis un <asp:RegularExpressionValidator et veux contrôler un champ text qui doit contenir une date au format JJ/MM/AAAA et en plsu, qui doit prendre en compte le calcul de l'âge car je veux que la saisi donne un âge compris entre 18 et 99 ans.

    Premier problème : j'arrive pas à contrôler le format de la date, visiblement y a un problème avec les 4 chiffres de l'année.
    Deuxième problème : je n'ai aucun idée de comment on peut dire à une expression régulière de prendre la date courante pour calculer l'âge.

    Vous pouvez maider ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Les expressions régulières ne sont pas la solution magique à tous les problèmes
    Ce que tu veux faire pour vérifier l'age est tout bonnement impossible avec une regex.

    Même vérifier qu'une date est valide, c'est pas vraiment possible, ou du moins super galère : par exemple, il faut gérer le fait que le mois doit être entre 1 et 12, que le nombre de jour est entre 1 et 30 ou entre 1 et 31 selon le mois, voire entre 1 et 28 pour février (29 pour une année bissextile...). Bref, beaucoup trop compliqué pour une regex.

    A mon avis, le plus simple c'est que tu utilises un CustomValidator pour gérer toi-manuellement la validation dans le code-behind. Tout ce que tu as à faire, c'est tester si la date est valide (avec DateTime.TryParse) et si l'âge dans la plage voulue.

    (au fait, ton site est interdit aux centenaires ? )

  3. #3
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, je vais tester tout ça.

    Merci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  4. #4
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Citation Envoyé par tomlev Voir le message
    (au fait, ton site est interdit aux centenaires ? )
    Ben en fait, je sais pas trop, j'y ai réfléchi toute la nuit et je me dis qu'arrivé à un certain âge, ça clique plus droit...... hi hi hi

    Bon, sinon, j'ai un petit souci sur l'établissement du contrôle. Y a un détail que j'ai pas bien capté dans le TryParse, je crois.
    Autre point : c'est bien un contrôle serveur, donc il va poster ma page pour faire ce contrôle ? ça va pas me poser des soucis sur l'enregistrement des autres données ?
    Bon, voilà le code, déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Protected Sub cvDateNaissance_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles cvDateNaissance.ServerValidate
            Dim testdate As Date
            If DateTime.TryParse(args.Value, testdate) Then
                If Year(Now) - Year(testdate) < 18 And Year(Now) - Year(testdate) > 120 Then
                    args.IsValid = False
                Else
                    args.IsValid = True
                End If
            Else
                args.IsValid = False
            End If
     
        End Sub
    Le TestDate, je l'ai fait un peu au hasard, je dois dire, mais est qu'il récupère bien la date ?

    Ensuite je vois pas comment je peux le forcer à faire une date avec l'année sur 4 chiffres, j'ai pas trouvé.

    Et question subsidaire : je me serais pas (une fois de plus) gourré sur mon test avec l'âge. J'ai le don pour ma gourré sur les < et les >, mais depuis tout petit déjà ! Faut dire aussi que j'ai pas beaucoup joué à PacMan.

    Merci pour ton aide.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Autre point : c'est bien un contrôle serveur, donc il va poster ma page pour faire ce contrôle ? ça va pas me poser des soucis sur l'enregistrement des autres données ?
    Ca va faire un postback, oui. Après je suis pas trop expert en ASP.NET, mais je crois que tu dois tester Page.IsValid avant de faire l'enregistrement

    Citation Envoyé par zooffy Voir le message
    Le TestDate, je l'ai fait un peu au hasard, je dois dire, mais est qu'il récupère bien la date ?
    Oui, il renvoie true et affecte la date à testdate si args.Value représente une date valide. Par contre testdate doit être de type DateTime et non Date (Date est un type spécifique à VB, le type standard pour les dates en .NET est DateTime)

    Citation Envoyé par zooffy Voir le message
    Ensuite je vois pas comment je peux le forcer à faire une date avec l'année sur 4 chiffres, j'ai pas trouvé.
    Ben le format de date par défaut en français a l'année sur 4 chiffres... Donc ça fonctionnera pas si l'utilisateur n'en saisit que 2.

    Si tu veux forcer l'utilisation d'un format spécifique, tu peux utiliser DateTime.ParseExact

    Citation Envoyé par zooffy Voir le message
    Et question subsidaire : je me serais pas (une fois de plus) gourré sur mon test avec l'âge
    2 trucs qui vont pas :
    - Il faut faire un Or et non un And : le gars ne peut pas avoir à la fois moins de 18 ans et plus de 99
    - en testant uniquement sur l'année tu peux faire des erreurs... Exemple : quelqu'un qui est né en décembre 1992 n'a pas encore 18 ans, mais 2010 - 1992 = 18, donc il passe...

    Il faut faire la différence sur les dates, et tester le nombre d'années :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim age As TimeSpan = DateTime.Now - testdate
    If age.TotalYears < 18 Or age.TotalYears > 99 Then
        args.IsValid = False
    Else
        args.IsValid = True
    End If

  6. #6
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Super génial, ça fait plaisir de lire quelqu'un qui donne des détails comme toi.

    Merci, merci beaucoup. Avec mes soucis d'hébergeur, j'avais besoin de lire du constructif.

    Alors ok pour le OR au lieu du AND, mais j'ai pas la tête au dévelopement ce matin.

    L'histoire du parse, je savait pas. J'avoue que la gestion des dates à toujours été un léger souci pour moi. J'ai du mal avec ce qui n'est pas purmement décimal.

    Faut que j'aille voir le détail de TryParseExact, il me demande le format et je sais pas quoi lui mettre mais la MSDN devrait me le dire.

    Par contre souci sur TotalYears il me dit que ce n'est pas un membre de TimeSpan.

    Sur le test uniquement sur l'année, ce n'est pas trés grave. Certes ce n'est pas précis, mais la cible de ce site est une CSP moyenne,donc des gens plutôt entre 25 et 50 ans. L'idée c'est de viré les mineurs (il y a une histoire d'argent dans le site) et les plaisantins qui ont tous 109 ans !!!!

    Mais bon, un peu de précision en fera pas de mal.
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Par contre souci sur TotalYears il me dit que ce n'est pas un membre de TimeSpan.
    Arf, c'est vrai... dans ce cas tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim years As Integer = age.TotalDays / 365.25
    (le .25 permet de tenir compte des années bissextiles...)

  8. #8
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    Voic mon code final :
    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
     
        Protected Sub cvDateNaissance_ServerValidate(ByVal source As Object, ByVal args As System.Web.UI.WebControls.ServerValidateEventArgs) Handles cvDateNaissance.ServerValidate
            Dim frFR As New CultureInfo("fr-FR")
            Dim testdate As DateTime
     
            If DateTime.TryParseExact(args.Value, "dd/mm/yyyy", frFR, DateTimeStyles.None, testdate) Then
     
                Dim age As TimeSpan = DateTime.Now - testdate
                Dim years As Integer = age.TotalDays / 365.25
                If years < 18 Or years > 99 Then
                     args.IsValid = False
                Else
                    args.IsValid = True
                End If
            Else
                args.IsValid = False
            End If
     
        End Sub
    Mais je ne capte pas un détail, doit y avoir un petit truc qui merdoie.

    Avec une date de naissance à 25/11/1992, donc 18 ans demain il me dis que ça passe. Alors vu le truc de la division, je me suis dis, pas trés grave, ça être une histoire d'arrondi.

    Mais même avec 1993 comme année de naissance il me le compte, jusqu'au 31/12/1993. il faut passé à 01/01/1994 pour qu'il le jette.

    Y aurait pas un détail qui m'échappe là ?
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ton format de date est pas bon : "mm" c'est les minutes. Donc il considère les chiffres du milieu comme des minutes, et il laisse les mois à la valeur par défaut, soit 1 (janvier). Pour les mois, c'est "MM".

    D'autre part, le fait de déclarer years en Integer cause des problèmes d'arrondi, il vaut mieux le déclarer en Double.

    Mais même comme ça, ça marche toujours pas pour le 25/11/1995, parce que l'âge calculé est 18.000252 (à cause de l'approximation pour les années bissextiles)

    Donc soit tu laisses comme ça, sachant que tu auras un problème à 1 jour près, soit il faut gérer ça un peu plus finement...

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Pourle coup des 18 ans, il y a une solution beaucoup plus simple que le coup des jours mulitpliés par 362.25 c'est, une fois convertie la date de naissance en DateTime, faire un AddYears(18) sur la date en question et comparer avec la date du jour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DateTime dateDeNaissance;
     
    // lecture et verif saisie date de naissance ici
    // .....
    // PUIS :
    DateTime controlAge = dateDeNaissance.AddYears(18):
    if(controlAge > DateTime.Now)
    {
     
    // Message : t'es trop jeune gamin.
    }
    Je vous laisse convertir en VerBeux.Net

    L'inverse est aussi possible, prendre la date du jour, faire un

    et en déduire une date de naissance minimale pour la saisie.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Re, voilà une implémentation qui semble marcher :

    Code VB.NET : 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
    Function GetAge(ByVal dateOfBirth As DateTime) As Integer
        Dim today As DateTime = DateTime.Today
        Dim month As Integer = dateOfBirth.Month
        Dim day As Integer = dateOfBirth.Day
     
        ' Cas particulier du 29 février
        If month = 2 AndAlso day = 29 AndAlso Not DateTime.IsLeapYear(today.Year) Then
            month = 3
            day = 1
        End If
     
        Dim birthdayThisYear As DateTime = New DateTime(today.Year, month, day)
     
        If birthdayThisYear < today Then ' Anniversaire cette année déjà passé
            Return today.Year - dateOfBirth.Year
        Else ' Anniversaire cette année pas encore passé
            Return today.Year - dateOfBirth.Year - 1
        End If
    End Function


    EDIT:
    Citation Envoyé par Bluedeep Voir le message
    Pourle coup des 18 ans, il y a une solution beaucoup plus simple que le coup des jours mulitpliés par 362.25 c'est, une fois convertie la date de naissance en DateTime, faire un AddYears(18) sur la date en question et comparer avec la date du jour.
    Arf, j'ai honte de pas y avoir pensé

    Par contre, ça pose un petit problème pour le 29 février : pour le 29/02/1992, AddYears(18) renvoie 28/02/2010 et non 01/03/2010. Donc on considèrera qu'il a 18 ans un jour trop top... mais bon, ça reste acceptable je pense

  12. #12
    Membre extrêmement actif
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Points : 1 434
    Points
    1 434
    Par défaut
    Un grand, trés grand merci à toi.

    Pour le 29 Février, c'est pas trés grave, un jour de décalage, il vraiment trés peu de chance pour que cela arrive.

    ça marche super bien ta fonction.

    Et le Page.IsValid aussi, j'ai réussi à l'implémenter facilement.

    @ la prochaine
    Mon blog de création d'univers : Qualhiryann
    Mon site qui parle de moi www.ozouf.com
    Pour les joueurs de WOW je suis sur Ysondres et mon perso est Ablanore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Expression régulière sur une date
    Par mattyeux dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/09/2007, 18h08
  2. [RegEx] Expression régulière sur une date
    Par mattyeux dans le forum Langage
    Réponses: 1
    Dernier message: 21/09/2007, 12h16
  3. [RegEx] Contrôle avec expression régulière
    Par lodan dans le forum Langage
    Réponses: 8
    Dernier message: 23/10/2006, 20h32
  4. [RegEx] expression régulière - date
    Par dark_demon dans le forum Langage
    Réponses: 15
    Dernier message: 23/06/2006, 13h14
  5. [RegEx] expression régulière et date
    Par r-zo dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 14h27

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