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

Contribuez Discussion :

[FAQ] Vérifier la validité d'une date


Sujet :

Contribuez

  1. #1
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut [FAQ] Vérifier la validité d'une date
    S'il est relativement facile de vérifier qu'une date semble valide (jour de 1 à 31 éventuellement de 1 à 30 / mois de 1 à 12 et année sur 4 chiffres), il est beaucoup plus difficile de vérifier réellement qu'une date entrée correspond à une vraie date (en particulier pour les années bissextiles).
    Heureusement, l'objet Date() de javascript possède une astuce souvent méconnue :
    Toute valeur numérique est valable pour la définition d'une date, du coup, si vous entrez une date qui n'existe pas, javascript va rectifier de lui-même (par exemple, le 32 janvier deviendra le 1er février).
    Grâce à cette astuce, nous pouvons facilement vérifier le format de la date (dans l'exemple donné le jour et le mois sur 1 ou 2 chiffres et l'année sur 4 séparés par des /) puis on affecte les valeurs splittées à une nouvelle date (en prenant soin de rectifier le mois qui commence par 0 en js !) et on vérifie que le jour le mois et l'année obtenus sont identiques à ceux de la date initiale.
    Si ce n'est pas le cas, la date n'est pas valide !

    Voici la source :
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
    <head>
    <title>Vérification de date</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta name="Author" content="Bovino - www.developpez.com" />
    <script type="text/javascript">
    <!--
    function verif(){
        var date_pas_sure = document.getElementById('valeur').value;
        var format = /^(\d{1,2}\/){2}\d{4}$/;
        if(!format.test(date_pas_sure)){alert('Date non valable !')}
        else{
            var date_temp = date_pas_sure.split('/');
            date_temp[1] -=1;        // On rectifie le mois !!!
            var ma_date = new Date();
            ma_date.setFullYear(date_temp[2]);
            ma_date.setMonth(date_temp[1]);
            ma_date.setDate(date_temp[0]);
            if(ma_date.getFullYear()==date_temp[2] && ma_date.getMonth()==date_temp[1] && ma_date.getDate()==date_temp[0]){
                alert('Date valable !');
            }
            else{
                alert('Date non valable !');
            }
        }
    }
    //-->
    </script>
    </head>
     
    <body>
        <form action="javascript:verif()">
            <div style="margin: 50px 0 0 50px">
                <label for="valeur">Entrez un date au format jj/mm/aaaa : </label>
                <input type="text" id="valeur" /><br />
                <input type="submit" value="Vérifier la date" />
            </div>
        </form>
    </body>
    </html>
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    et ce test-là Bovino, tu le connais?
    http://www.developpez.net/forums/m878767-31/

    merci d'utiliser la fonction Recherche!

    (nan, je rigole )

  3. #3
    Expert confirmé
    Avatar de le_chomeur
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2006
    Messages
    3 653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 3 653
    Points : 4 835
    Points
    4 835
    Par défaut
    de plus , javascript rectifit automatiquement les dates .. par exemple le 30 février donnera 1er mars ...
    est ton ami fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes

    Premier ministre du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts )

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par javatwister Voir le message
    et ce test-là Bovino, tu le connais?
    http://www.developpez.net/forums/m878767-31/

    merci d'utiliser la fonction Recherche!

    (nan, je rigole )
    Arf... j'avais pas vu, désolé !

    Citation Envoyé par le_chomeur
    de plus , javascript rectifit automatiquement les dates .. par exemple le 30 février donnera 1er mars
    Oui, c'est précisément ça qui te permet de vérifier si la date renvoyée est la même que la date entrée et donc si la date entrée était valable !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Merci Bovino, je t'emprunte ta fonction

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Avec plaisir !
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 912
    Points
    79 912
    Par défaut
    N'oublie pas de la rendre, elle pourrait être utile à d'autres.


  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Je viens de tomber sur un bug bizarre avec cette fonction quand j'utilise la fonction avec cette date 28/02/2013 ça renvoi 'Date non valable !'. J'ai pallié le bug sans trop comprendre comment en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ma_date.setMonth(date_temp[1]);
    ma_date.setMonth(date_temp[1]);
    Exactement la même instruction deux fois de suite !
    Si quelqu'un a une explication...

  9. #9
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    En passant, il serait mieux de faire ce test :

    Les ma_date.getMonth / ma_date.getMonth renvoient des int tandis que les autres sont des chaines (quand c'est inférieur à 10 ça revient à faire un test 9 != 09 par exemple. Ça renvoie non égal alors qu'ils le sont en réalité)

    En somme, cela donnerait :
    Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    date_split = date_a_tester.split('/', 3);
    date = new Date(date_split[2], date_split[1] - 1, date_split[0]);
    if ( date.getFullYear() == date_split[2] && (date.getMonth()+1)  == parseInt(date_split[1]) && date.getDate() == parseInt(date_split[0]) && /^(\d{1,2}\/){2}\d{4}$/.test(date_a_tester)) 
      alert("La date est valide.");
    else
      alert("La date n'est pas valide.");

  10. #10
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Des || à la place des &&
    Euh... pas vraiment...
    Voir le test suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var ma_date = new Date(2012, 8, 14);
    var date_temp = [12, 7, 2012];
    if(ma_date.getFullYear()==date_temp[2] || ma_date.getMonth()==parseInt(date_temp[1]) || ma_date.getMonth()==parseInt(date_temp[0])){
        alert('Date valable !');
    }
    else{
        alert('Date non valable !');
    }
    quand c'est inférieur à 10 ça revient à faire un test 9 != 09 par exemple.
    Pas d'accord non plus, ça revient à faire 9 != '09' qui renvoi le bon résultat...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  11. #11
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Euh... pas vraiment...
    Voir le test suivant
    Oui désolé, je devais modifier mon message pendant l'écriture du vôtre ! J'ai fait le test inverse de mon coté, c'est pour ça.

    Pas d'accord non plus, ça revient à faire 9 != '09' qui renvoi le bon résultat...
    je tournerai ma langue deux fois avant de poster la prochaine fois. En effet, de mon coté j'ai transformé les .getXXX en chaine pour reconstituer la date complète ... bref, perte de temps, désolé

  12. #12
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2005
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour, je me permets de déterrer ce sujet pour signaler un bug dans cette fonction.

    Cela se produit en toute fin d'un mois lorsque la date que l'on souhaite valider se trouve sur un mois possédant moins de jours que le jour courant.
    Concrètement, si l'on est le 30 janvier et que l'on tente de valider une date en février, ce dernier ne comptant que 28 jour le test va planter.

    Ceci parce que le code date = new Date() retourne la date du jour, donc dans notre exemple 30/01/2015 (quand d'autres langages retournent 01/01/01).

    Ensuite on fait date.SetMonth(1) (1 correspondant à février), et on se retrouve logiquement avec la date 30/02/2015 donc une date non valide, ce que javascript ne permet pas et modifie automatiquement en 30/03/2015.

    Lorsque enfin on compare les dates, les mois étant différents la date d'entrée est considérée invalide.

    Le premier contournement possible est donc de faire date.SetDate(1) aussitôt après le new Date().
    Mais on pourrait simplement utiliser le constructeur new Date(annee, mois, jour).

  13. #13
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Points : 274
    Points
    274
    Par défaut
    Pour en revenir sur le code proposé et le dernier message de kalvados, il ne sert à rien de comparer les années, mois et jours des 2 dates pour savoir si la date initiale est valide. Il suffit juste de comparer les mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function validateDate(dateStr) {
        var dateArr = dateStr.split('/');
        var newDate = new Date(dateArr[2], parseInt(dateArr[1],10)-1, parseInt(dateArr[0],10));
        return newDate.getMonth() == parseInt(dateArr[1],10)-1;
    }
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    validateDate('30/01/2014') => true
    validateDate('29/02/2013') => false
    Comme l'a expliqué notre ami kalvados, l'objet date recalcule automatiquement donc on va se retrouver avec un 01/03/2013 si on fait un new Date() avec 29/02/2013.
    Pour Info il ne sert à rien d'utiliser setDate(), setMonth, etc... le new Date() suffit à lui même.

Discussions similaires

  1. [v15.7] Vérifier la validité d'une date
    Par GAEREL dans le forum Sybase
    Réponses: 3
    Dernier message: 25/09/2013, 13h04
  2. Vérifier la validité d'une date
    Par Agoye dans le forum Langage SQL
    Réponses: 9
    Dernier message: 04/06/2008, 19h00
  3. [Dates] comment vérifier la validité d'une date en php
    Par cortex024 dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2007, 10h46
  4. vérifier la validité d'une date
    Par youp_db dans le forum Langage
    Réponses: 1
    Dernier message: 04/10/2006, 12h38
  5. vérifier la validité d'une date
    Par griese dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 06/06/2006, 17h11

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