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 :

Date : parsing d'une string de type date


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut Date : parsing d'une string de type date
    Bonjour,
    Petit problème de parsing d'une String au format date quand la string contient un caractère incorrect.
    le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        private static SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
     
        public Date getDate(String ds){
              sdf.setLenient(false);
              Date dn = null;
              try {
                  dn = sdf.parse(ds.trim());
              } catch(ParseException pe){
                 System.out.println("Erreur format : " + pe);
              }   
              return dn;    
        }
    Si je passe une string avec un caractère alphabétique de la forme :
    19-07-2A05
    je récupère une date au format
    19-07-0002
    alors que je m'attends à une exception.
    La méthode SimpleDateFormat.parse(String st), bien qu'elle ne prenne pas toujours la totalité de la chaine, devrai au moins respecter le pattern déclaré : dd-MM-yyyy.
    Si quelqu'un a une explication pour éclairer ma lanterne !!!!

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    La longueur des champs n'est respecté que lors du formatage.
    A la lecture seule le contenu compte. Après tout 19-07-2 est une date valide...

    Pour pallier à cela il faut forcer le parse() à lire toute la chaine, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public static Date parseFullDate(DateFormat df, String source)
    			throws ParseException {
    		ParsePosition pos = new ParsePosition(0);
    		Date date = df.parse(source, pos);
    		if (pos.getErrorIndex() >= 0)
    			throw new ParseException("Unparseable date: \"" + source + "\"",
    				pos.getErrorIndex());
    		if (pos.getIndex() != source.length())
    			throw new ParseException("Unparseable date: \"" + source + "\"",
    				pos.getIndex() + 1);
    		return date;
    	}

    a++

    PS : Au passage attention au SimpleDateFormat définie en static ! Cette classe n'est pas thread-safe et cela peut donc poser des problèmes...

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci pour la réponse : je croyais que setLenient(false) imposait un respect strict du pattern à la lecture.
    A défaut de solution, je serais passé par une expression régulière.
    Thanks.

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hapalemur Voir le message
    Merci pour la réponse : je croyais que setLenient(false) imposait un respect strict du pattern à la lecture.
    Non : setLenient(false) ne concerne pas le format de la date mais uniquement sa valeur. Cela permet d'éviter que les dates invalides ne soit "corrigées".

    Par exemple avec la date "31-04-2011" (qui n'existe pas puisque avril ne compte que 30 jours). En setLenient(true) (par défaut) la date sera corrigé et retournera le "01-05-2011", alors qu'en setLenient(false) cela génèrera une erreur.


    a++

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 82
    Points
    82
    Par défaut
    Merci, c'est clair

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

Discussions similaires

  1. [Debutant] definir une constante de type Date
    Par gloglo dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 15/12/2006, 13h20
  2. [VB.Net/Dataview] Comment gérer un filtre sur une colonne de type date ?
    Par silatchom dans le forum Accès aux données
    Réponses: 3
    Dernier message: 07/07/2006, 20h28
  3. comment declarer une variable de type date ?
    Par MAJIK_ENIS dans le forum JDBC
    Réponses: 1
    Dernier message: 26/05/2006, 01h02
  4. Réponses: 14
    Dernier message: 28/10/2005, 19h41

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