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 :

difficultés pour convertir une string en date


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut difficultés pour convertir une string en date
    Bonjour

    J'ai un problème pour convertir des chaînes de caractère en object Date.
    Je reçois en entrée ce genre de string:

    26 oct. 1927
    19 nov. 1952
    14 déc. 1953
    11 janv. 1860
    5 févr. 1896
    30 mars 2006
    30 mars 2006

    J'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Date decisionDate = tryParse(myDateString, "d MMM. yyyy");
    if (decisionDate == null){
    	decisionDate = tryParse(myDateString, "d MMMM yyyy");
    }
    et le code de la méthode tryParse():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private Date tryParse(String dateString, String formatString)
    {
            Date d = null;
            try
            {
                d = new SimpleDateFormat(formatString).parse(dateString);
            }
            catch (ParseException e) {}
     
    	return d;
    }
    La méthode me retourne toujours null. Donc le parsing ne fonctionne pas.

    Alors, est-ce que mon pattern de date est mauvais ou bien est-ce qu'il n'est pas possible de convertir ce type de chaine de caractère en date?

    Merci par avance

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String myDateString = "16 mars 1992";
    Date decisionDate = tryParse(myDateString, "d MMMM yyyy");
    System.err.println("=="+decisionDate);
    Ca marche nickel quand le mot du mois est dans la bonne langue, même si le mot du mois n'est pas entier. (Enfin ca depend [Févr.] passe, mais [Févri.] ne passera pas)
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif Avatar de Mamypirate
    Homme Profil pro
    Samouraï
    Inscrit en
    Mai 2011
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Samouraï
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2011
    Messages : 108
    Points : 211
    Points
    211
    Par défaut
    Le code que tu fournis fonctionne bien chez moi (y compris en français, avec le mois tronqué ou non).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    try {
    findSignature();
    } catch(InspirationNotFoundException e) {
    e.printStackTrace();
    }

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    catch (ParseException e) {}
    Toujours regarder le message de l'exception en cas de problème

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Merci pour vos retours

    C'est vraiment bizarre, j'ai copié le code de wax78 dans un test unitaire et ça m'affiche "==null" :/

    Je ne comprend pas d'où peut venir le problème. J'utilise jdk 1.6.0_24.

    Une idée? =o

  6. #6
    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
    affichez votre exceptions, s'il vous plait. Tout ce que le null nous dit c'est qu'il y a eu un ParseException, reste à savoir sur quoi!

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Oui, désolé ^^ J'étais en train d'éditer mon message précédent

    Le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.text.ParseException: Unparseable date: "16 mars 1992"
    	at java.text.DateFormat.parse(DateFormat.java:337)

  8. #8
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Ca donne quoi ce code ?
    System.out.println(Locale.getDefault())
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    @Nemek : Bien vu! Je n'y avais pas pensé mais le serveur sur lequel est ma session de travail est en anglais et par conséquent, Locale.getDefault() retourne "en_US".

    Du coup j'ai modifié mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private Date tryParse(String dateString, String formatString)
    {
            Date d = null;
            try
            {
                d = new SimpleDateFormat(formatString, Local.FRANCE).parse(dateString);
            }
            catch (ParseException e) {}
     
    	return d;
    }
    et là ça fonctionne

    Merci pour votre aide à tous

  10. #10
    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,

    Ceci sert un peu à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Date decisionDate = tryParse(myDateString, "d MMM. yyyy");
    if (decisionDate == null){
    	decisionDate = tryParse(myDateString, "d MMMM yyyy");
    }
    Vu que "MMM" acceptera "oct." et "octobre", donc ceci est amplement suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date decisionDate = tryParse(myDateString, "d MMM yyyy");


    De plus j'irais encore plus loin que tchize_ : il ne faut pas catcher l'exception. En effet quel intérêt y-a-t-il à catcher l'exception si c'est pour se prendre un NullPointer derrière... Autant avoir directement le ParseException.


    Si tu fais cela uniquement pour t'éviter les checked-exception il suffit de l'englober dans une unchecked :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	} catch (ParseException e) {
    		throw new RuntimeException(e);
    	}



    Enfin il faut se méfier de deux chose :
    • Le mode setLenient(true) activé par défaut, qui fait que les dates erronées sont automatiquement corrigées (par exemple le "32 octobre" devient le "1er novembre"). Ce comportement n'est pas forcément souhaitable :/
    • Le parse() qui ne lit pas forcément tout la chaine, ce qui n'est pas forcément souhaitable non plus. Il faut utiliser parse(String,ParsePosition) pour éviter ce désagrément.




    a++

  11. #11
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Pour le format du SimpleDateFormat, tu as raison. Au départ, je ne savais pas que le second format pouvait catcher les deux types Après quelques essais, j'ai effectivement retiré le "d MMM. yyyy".

    Après il s'est avéré qu'avec le SimpleDateFormat, j'avais quelques petits problèmes selon que la première lettre du mois était en majuscule ou en minuscule.

    Du coup j'ai remplacé le code par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Date decisionDate = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.FRANCE).parse(myStringDate);
    Ça passe pour presque tout sauf quand une date est écrite de la façon suivant :

    1er Janvier 2001
    . Le "1er" n'est pas accepté. Est-ce qu'il y aurait une solution pour ce cas, autre que modifier la string avant de la parser?

    Merci

    ps: je vais rajouter le parsePosition dans la méthode parse(string, parsePosition) ^^

  12. #12
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 074
    Points : 7 978
    Points
    7 978
    Par défaut
    Bah si tu as toujours 3 mots separés par un truc (espace je suposse). Tu px splitter en 3. Prendre le premier bout (1er) et t'arragner avec un Regexp ou autre pour supprimer tout ce qui n'est pas une chiffre ?

    Puis recomposer le string de la date et le parser avec ton parseur.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2009
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 83
    Points : 89
    Points
    89
    Par défaut
    Ok mais à priori il n'y a donc pas de parser de date natif qui prenne en charge ce format là ?

  14. #14
    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
    Tu peux essayer ça en tandem:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "d MMMM yyyy"
    "d'er' MMMM yyyy"

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

Discussions similaires

  1. Probleme pour parser une String en Date
    Par DrTank dans le forum Langage
    Réponses: 3
    Dernier message: 04/05/2007, 19h19
  2. convertir une string en date
    Par Art19 dans le forum Delphi
    Réponses: 7
    Dernier message: 23/04/2007, 17h42
  3. Convertir une string en date.
    Par Empty_body dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/11/2006, 21h56
  4. [vba] convertir une string en date
    Par megapacman dans le forum Access
    Réponses: 1
    Dernier message: 11/09/2006, 15h46
  5. [Firebird] Convertir une String en date
    Par laffreuxthomas dans le forum SQL
    Réponses: 1
    Dernier message: 04/05/2005, 19h42

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