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

Java Discussion :

SimpleDateFormat parse trop permissif


Sujet :

Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut SimpleDateFormat parse trop permissif
    Bonjour,


    Quand un truc simple et que l'on pense qui va marché sans soucis tourne au drame... lol

    Dans un champ xml je dois valider une date que si elle a le format yyyy-MM-dd ou yyyy et j 'effectue l'opération suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SimpleDateFormt sdf = new SimpleDateFormat("yyyy-MM-dd");
    Date date = sdf.parse("2014-03-03T05:00:00+00:00");
    ou même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SimpleDateFormt sdf = new SimpleDateFormat("yyyy");
    La je m'attendais à avoir une exception, mais pas de soucis la date est bien parser dans les deux cas....


    Comment faire un parse et ne pas avoir d'exception que si la date correspond strictement au format?

    La solution d'une regexp est-ce la seule solution?

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Commencer par faire pour éviter que les dates genre 31 février soient acceptées

    Ensuite, tu dois utiliser la méthode parse(String, ParsePosition) et vérifier le ParsePosition après l'appel, pour être sûr que tous les caractères ont été consumés. DateFormat.parse ne consomme pas nécessairement toutes la chaine, il s'arrête dès qu'il a consommé tout ce qui correspond à son format.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Merci pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     formatter.setLenient(false);
    ça marche nickel.

    Voici un petit exemple pour tester ce que vous m'avez conseillé:

    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
    	  public static void main(String[] a) {
    		    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    		    String input[] = { "2013-31-02", 
    		                       "2014-03-01",
    		                       "2012" };
    		    for (int i = 0; i < input.length; i++) {
    		      ParsePosition pp = new ParsePosition(0);
    		      formatter.setLenient(false);
    		      Date d = formatter.parse(input[i], pp);
     
    		      if (d == null) {
    		        System.err.println("Invalid date in " + input[i]);
    		        continue;
    		      }
    		      System.out.print("analysée jusqu'à : " + pp.getIndex() + " position(s)");
    		      System.out.println(" on " + formatter.format(d));
     
    		    }
    		  }
    output:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Invalid date in 2013-31-02 (le formatter.setLenient(false); fonctionne bien)
    analysée jusqu'à : 10 position(s)  on 2014-03-01 (ok)
    Invalid date in 2012 (Là je pensais qu'il ne consommerais que 4 positions.... il là invalidé )
    Donc ensuite je fais le diff entre la String(Date) analysé et les positions consommés.


    Je vous remercie.


    cordialement,

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

Discussions similaires

  1. SimpleDateFormat parse ne récupère pas la bonne date
    Par gatemehdi dans le forum Général Java
    Réponses: 6
    Dernier message: 27/05/2014, 00h49
  2. [GWT-Widget] SimpleDateFormat.parse() ne fonctionne pas
    Par touille dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 27/05/2010, 18h05
  3. Probleme de conversion String -> Date avec SimpleDateFormat.parse(String)
    Par jeanlouis_lecodeur dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 02/07/2007, 09h18
  4. Problème avec SimpleDateFormat.parse(Date)
    Par nad dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2006, 13h34
  5. conversion String en Date (parse trop permissif)
    Par ciloulou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/09/2004, 18h36

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