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

Langage Java Discussion :

Vérifier validité date


Sujet :

Langage Java

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 29
    Points : 19
    Points
    19
    Par défaut Vérifier validité date
    Salut

    Je voulais savoir si il existait une méthode vérifiant la validité d'un objet Date ou Calendar.
    Par exemple je peux créer sans problème un objet Calendar avec comme valeur 40 pour le jour et 20 pour le mois...

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Il n'y a a priori pas moyen de savoir si ton calendar/ta date est correct(e) ou pas, tu dois gérer ça par toi même.

    Bon courage !

    mavina

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    LOL OK merci je vais m'amuser avec les années bissextiles...
    Etonnant quand même ce vide dans java, il doit exister des API, je vais chercher ça...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Tu peux essayer ça avec de l'expression régulière

    Testé dans tous les sens

    Trouvé sur le forum de Sun (amen)

    N'oublie pas d'importer java.util.regex.*;

    (Ma date en entrée suit le format immuable JJ/MM/AAAA)
    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
     
    public boolean valideDate(String date_tmp)
        {
            String date_finale;
            String jour;
            String mois;
            String annee;
            jour = date_tmp.substring(0, 1) + date_tmp.substring(1, 2);
            mois = date_tmp.substring(3, 4) + date_tmp.substring(4, 5);
            annee = date_tmp.substring(6, 7) + date_tmp.substring(7, 8) + date_tmp.substring(8, 9) + date_tmp.substring(9, 10);
     
            date_finale = jour + "/" + mois + "/" + annee;
            String DatePattern = "^(?:(31)(\\D)(0?[13578]|1[02])\\2|(29|30)(\\D)(0?[13-9]|1[0-2])\\5|(0?[1-9]|1\\d|2[0-8])(\\D)(0?[1-9]|1[0-2])\\8)((?:1[6-9]|[2-9]\\d)?\\d{2})$|^(29)(\\D)(0?2)\\12((?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:16|[2468][048]|[3579][26])00)$";
            if(date_finale.matches(DatePattern))
                return true;
            else
                return false;
        }
    Ca fait même les années bissextiles et tout le toutim, depuis le 01/01/1600 jusque le 31/12/9999.
    T'as de quoi faire

    Bien sûr, ça répond indirectement à ton problème en validant la date avant d'instancier un objet Calendar ou Date basé sur ta date.

    Bon courage

  5. #5
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    je reviens sur ce que j'ai dit :
    When a Calendar is lenient, it accepts a wider range of field values than it produces. For example, a lenient GregorianCalendar interprets MONTH == JANUARY, DAY_OF_MONTH == 32 as February 1. A non-lenient GregorianCalendar throws an exception when given out-of-range field settings.
    Donc d'apres ce qui est marqué, un monCalendar.setLenient(false) serait suffisant pour déclancher des exceptions en cas d'ajout erroné. (non testé)

    mavina

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Ok je vais tester l'histoire du isLenient()...
    Sinon j'ai pas trouver d'API mais j'ai écrit ma propre méthode (merci CitizenM mais celle de sun est un peut compliquer pour moi).
    A préciser j'utilise des int en entrée comme mes valeurs sont récupérer d'une interface graphique (donc String)

    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
     
        public Boolean VerifDate(int annee,int mois,int jour){
            // Déclaration des variables (la création d'un objet GregorianCalendar 
            // permet juste d'accéder à la méthode isLeapYear)
            Boolean estValide = true;
            GregorianCalendar gc = new GregorianCalendar();
            int jourDansLeMois;
            // Nombre de jours dans chaque mois
            int dom[] = { 31, 28, 31, 30, /* jan feb mar apr */
            31, 30, 31, 31, /* may jun jul aug */
            30, 31, 30, 31 /* sep oct nov dec */
            };
            // Si le mois saisie n'est pas situé entre 1 et 12
            if ((mois < 1) || (mois > 12)){
                estValide = false;
            }
            else{   
                // Nombre de jours du mois saisie
                jourDansLeMois = dom[mois-1];
                // Si l'année est bissextile et le mois est février on ajoute un jour
                if (gc.isLeapYear(annee) && (mois == 2))
                    ++jourDansLeMois;
                // Si le jour saisie n'est pas situé entre 1 et le nombre de jour dans le mois
                if ((jour < 1) || (jour > jourDansLeMois)){
                    estValide = false;
                }
            } 
            return estValide;
        }

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Tu sais ma méthode est très simple, tu appliques une vérification basée sur une expression régulière à un String, date au format JJ/MM/AAAA.

    Das ton cas ça reviendrait à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    date_to_check = "" + jour + "/" + mois + "/" annee
    String DatePattern = "^[...]";
    if(date_to_check.matches(DatePattern))
        return true;
    else
        return false;
    Ca checke les années bissextiles, la validité j/m/a, bref que du tou bon.
    Si tu préfères utiliser ta méthode, aucun problème

    Bon courache

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Ok j'ai testé isLenient ca marche nickel (année bissextile compris)
    Les messages d'exceptions indique même d'ou vient l'erreur ("MONTH", "DAY_OF_MONTH")
    Ne pas oublié que pour un objet Calendar les mois commence à 0 et les jours à 1
    Exemple (estValide est à true car 2004 est une année bissextile)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            Boolean estValide = true;
            Calendar c = Calendar.getInstance();
            c.setLenient(false);
            c.set(2004,01,29);        
            try{
              c.getTime();  
            }
            catch(IllegalArgumentException iAE){
                estValide = false;
            }
    Voila merci à tous...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    Un dernier post pour dire que la méthode de CitizenM marche effectivement et une remarque sur isLenient():
    L'erreur n'est pas relevé los du c.set() mais lors de l'utilisation de l'objet calendar (dans l'exemple c.getTime()).

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

Discussions similaires

  1. [WD14] ne pas vérifier la date de validité d'un certificat
    Par therealmancool dans le forum WinDev
    Réponses: 8
    Dernier message: 23/06/2010, 09h31
  2. Contrôle Validité Date
    Par HiRoN dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 14/12/2007, 14h12
  3. [c#, vs2005, WinForms]Vérifier validité adresse mail
    Par Filippo dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/06/2007, 09h10
  4. Vérifier la date ?
    Par innova dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/11/2006, 11h56
  5. [debutant] verifier validité date
    Par tony_big_guy dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/06/2006, 15h07

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