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 :

String vers LocalDate dans l'API Java 8


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut String vers LocalDate dans l'API Java 8
    Bonjour,
    d'abord quelque chose qui fonctionne : si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String myDayString = "18 05 2014";
    			try {
    			    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MM yyyy");
    			    LocalDate myDayLocalDate = LocalDate.parse(myDayString, formatter);
    			    System.out.printf("Successfully parsed String %s, date is %s%n", myDayString, myDayLocalDate);
     
    			} catch (DateTimeParseException ex) {
    			    System.out.printf("%s is not parsable!%n", myDayString);
    			    ex.printStackTrace();
    			}
    j'obtiens correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Successfully parsed String 18 05 2014, date is 2014-05-18
    Mais bizarrement, si je veux utiliser les représentations littérales des mois, en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String myDayString = "18 Mar 2014";
    			try {
    			    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd MMM yyyy");
    			    LocalDate myDayLocalDate = LocalDate.parse(myDayString, formatter);
    			    System.out.printf("Successfully parsed String %s, date is %s%n", myDayString, myDayLocalDate);
     
    			} catch (DateTimeParseException ex) {
    			    System.out.printf("%s is not parsable!%n", myDayString);
    			    ex.printStackTrace();
    			}
    Il me vient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    18 Mar 2014 is not parsable!
    java.time.format.DateTimeParseException: Text '18 Mar 2014' could not be parsed at index 3
    	at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
    	at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
    	at java.time.LocalDate.parse(LocalDate.java:400)
    ...
    Pourquoi donc ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Hello,

    que constates-tu si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s = formatter.format(LocalDate.of(2014, 3, 18));		
    System.out.println(s);
    Peux-tu en tirer une conclusion ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    L'exemple que tu donnes fonctionne, mais il est différent.
    Ma question est finalement comment à partir d'une chaîne supposée donnée du type "18 Mar 2014" je peux tirer une LocalDate.

  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
    Et il t'as affiché quoi l'exemple donné? Indice: il n'a pas écrit "18 Mar 2014"

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    L'exemple que tu donnes fonctionne, mais il est différent.
    Exemple ? Fonctionne ? Différent ?

    Ta question finissait en "pourquoi ?"
    Je t'ai donné un bout de code et t'ai demandé s'il te dit pourquoi.

    Citation Envoyé par ptyxs Voir le message
    Ma question est finalement comment à partir d'une chaîne supposée donnée du type "18 Mar 2014" je peux tirer une LocalDate.
    Je dirais que ça dépend pourquoi tu voudrais que le mois de mars vienne de "Mar".

    - Si c'est parce qu'elles sont au format américain, il faut utiliser DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.US); ;

    - Si c'est parce que le fichier que tu lis aime bien écrire "Mar" au lieu de mars, j'ai pas trouvé plus simple que ceci :

    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
    Map<Long, String> monthsMap = new HashMap<>();
    monthsMap.put(1L, "Janv");
    monthsMap.put(2L, "Fév");
    monthsMap.put(3L, "Mar");
    monthsMap.put(4L, "Avr");
    monthsMap.put(5L, "Mai");
    monthsMap.put(6L, "Juin");
    monthsMap.put(7L, "Juil");
    monthsMap.put(8L, "Aoû");
    monthsMap.put(9L, "Sep");
    monthsMap.put(10L, "Oct");
    monthsMap.put(11L, "Nov");
    monthsMap.put(12L, "Déc");
     
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
      .appendPattern("dd ")
      .appendText(ChronoField.MONTH_OF_YEAR, monthsMap)
      .appendPattern(" yyyy")
      .toFormatter();
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Je dirais que ça dépend pourquoi tu voudrais que le mois de mars vienne de "Mar".

    - Si c'est parce qu'elles sont au format américain, il faut utiliser DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.US); ;

    - Si c'est parce que le fichier que tu lis aime bien écrire "Mar" au lieu de mars, j'ai pas trouvé plus simple que ceci :

    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
    Map<Long, String> monthsMap = new HashMap<>();
    monthsMap.put(1L, "Janv");
    monthsMap.put(2L, "Fév");
    monthsMap.put(3L, "Mar");
    monthsMap.put(4L, "Avr");
    monthsMap.put(5L, "Mai");
    monthsMap.put(6L, "Juin");
    monthsMap.put(7L, "Juil");
    monthsMap.put(8L, "Aoû");
    monthsMap.put(9L, "Sep");
    monthsMap.put(10L, "Oct");
    monthsMap.put(11L, "Nov");
    monthsMap.put(12L, "Déc");
     
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
      .appendPattern("dd ")
      .appendText(ChronoField.MONTH_OF_YEAR, monthsMap)
      .appendPattern(" yyyy")
      .toFormatter();
    Bon eh bien voilà donc un bout de réponse à la question posée dans mon premier message, dont je te remercie.

  7. #7
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Et pour compléter la réponse à ma question initiale, à l'attention des lecteurs intéressés, on peut trouver la liste des mois courts des locales anglaises et françaises dans cette page :
    L'utilisation des dates, par Jean-Michel Doudoux

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

Discussions similaires

  1. String vers date dans un tMap
    Par _GuiTs_ dans le forum Développement de jobs
    Réponses: 9
    Dernier message: 12/05/2009, 16h40
  2. Réponses: 1
    Dernier message: 22/04/2008, 10h20
  3. Les espaces dans une String vers une <TextArea>
    Par loopx dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 21/03/2008, 14h37
  4. integration d'une api dans un code java
    Par alphonse62 dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/04/2007, 11h29
  5. Demande d'information pour ajout d'API Java dans eclipse
    Par BernardT dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 07/07/2005, 17h08

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