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

Collection et Stream Java Discussion :

Validité de dates - SimpleDateFormat


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    pjb
    pjb est déconnecté
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Par défaut Validité de dates - SimpleDateFormat
    Bonjour tout le monde,
    J'ai un gros soucis : je voudrais vérifier la validité d'une date suivant un pattern donné.

    Pour y parvenir, j'utilise SimpleDateFormat, mais là c'est le drame !

    Pour le pattern "dd/MM/yyyy" :
    - pour "31/02/2000", il y a bien une erreur (cool...),
    - mais pas pour 11/02/200f (tout se passe comme si SimpleDateFormat "squizait" le "f" ==> an 200).

    Exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    df.setLenient(false);
    try {
       Date dt = df.parse("11/02/200f");  // devrait y avoir un ParseException !
       return true;
    } catch (ParseException e) {
       return false;
    }
    Auriez-vous des pistes ? Existe t-il une classe plus "élaborée" que SimpleDateFormat ?
    Merci d'avance !

  2. #2
    Membre émérite Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Par défaut
    Citation Envoyé par http://java.sun.com/j2se/1.4.2/docs/api/java/text/DateFormat.html#setLenient(boolean)
    With lenient parsing, the parser may use heuristics to interpret inputs that do not precisely match this object's format. With strict parsing, inputs must match this object's format.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 207
    Par défaut
    tu pourrais toujours utiliser les expressions régulière(regex) comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Boolean Valider;
    Pattern RegexDate;
    Matcher MatchDate;
     
    RegexDate = Pattern.Compile("^(([0]?[1-9]|1[0-2])/([0-2]?[0-9]|3[0-1])/[1-2]\d{3})? $ ");
     
    MatchDate = RegexDate.matcher("11/02/200f");
    Valider = MatchDate.find();
    si la valeur est valide il te retounera "True".

    il est aussi possible d'avoir différents formats d'expressions régulière sur ce site : http://www.regexlib.com

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    g_rare : justement il faut utiliser setLenient(false) afin de provoquer une erreur en cas de date incorrect


    setLenient(false) permet de générer une erreur sur des dates incorrectes style le 30 février

    Par contre "11/02/200f" est une date "correct" dans le sens où la méthode parse() ne lira pas forcément la chaine en entier (cela permet de lire directement des dates dans des chaines plus complexe. Ainsi ici elle lira seulement "11/02/200" qui est bien une date correct respectant le pattern...

    Tu peux utiliser la méthode parse(String,ParsePosition) pour détecter le nombre de caractère lu (attention cette méthode marche différemment, elle ne renvoi pas d'exception).

    Par exemple pour faire un parse() qui lira toute la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public static Date parseFullString(DateFormat df, String input) throws ParseException {
    		ParsePosition pos = new ParsePosition(0); // On commence le parsing au début de la chaine
    		Date date = df.parse(input, pos); // pas de ParseException
    		if (date==null) {
    			// Erreur lors du parsing ==> Exception
    			throw new ParseException(input, pos.getErrorIndex());
    		}
    		if (pos.getIndex()<input.length()) {
    			// La chaine n'a pas été lu dans sa totalité ==> Exception
    			throw new ParseException(input, pos.getIndex()+1);
    		}
    		return date;
    	}
    a++

  5. #5
    pjb
    pjb est déconnecté
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 5
    Par défaut
    OK merci beaucoup !

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

Discussions similaires

  1. [Date] simpleDateFormat et applet ?
    Par philobedo dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 25/01/2010, 09h49
  2. parse date SimpleDateFormat
    Par BigBarbare dans le forum Général Java
    Réponses: 2
    Dernier message: 21/09/2009, 13h15
  3. Problème format date - SimpleDateFormat inversion mois/jour
    Par juanqui dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 07/02/2007, 14h37
  4. convertir string en date (SimpleDateFormat)
    Par mnemonic78 dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2007, 16h41
  5. Votre avis : GregorianCalendar ou Date (SimpleDateFormat) ?
    Par MathiasM dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/09/2004, 16h43

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