web-dev-qa-db-fra.com

Comment analyser la chaîne complète du mois en utilisant le format de date en Java?

J'ai essayé ceci:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy");
Date d = fmt.parse("June 27, 2007");

erreur:

Exception in thread "main" Java.text.ParseException: Unparseable date: "June 27, 2007"

Les documents Java disent que je devrais utiliser quatre caractères pour correspondre à la forme complète. Je ne peux utiliser que [~ # ~] mmm [~ # ~ ] avec succès avec des mois abrégés comme "Jun" mais j'ai besoin de faire correspondre la forme complète.

Texte: pour le formatage, si le nombre de lettres de motif est de 4 ou plus, le formulaire complet est utilisé; sinon, un formulaire court ou abrégé est utilisé s'il est disponible. Pour l'analyse, les deux formes sont acceptées, indépendamment du nombre de lettres de modèle.

http://Java.Sun.com/j2se/1.6.0/docs/api/Java/text/SimpleDateFormat.html

49
tommy chheng

Vous utilisez probablement une locale où les noms de mois ne sont pas "janvier", "février", etc. mais quelques autres mots dans votre langue locale.

Essayez de spécifier les paramètres régionaux que vous souhaitez utiliser, par exemple Locale.US:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US);
Date d = fmt.parse("June 27,  2007");

En outre, vous disposez d'un espace supplémentaire dans la chaîne de date, mais cela n'a en fait aucun effet sur le résultat. Cela fonctionne de toute façon.

115
Mark Byers

Pour compléter la nouvelle API Java 8 API:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter();
TemporalAccessor ta = formatter.parse("June 27, 2007");
Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date d = Date.from(instant);
assertThat(d.getYear(), is(107));
assertThat(d.getMonth(), is(5));

Un peu plus verbeux mais vous voyez aussi que les méthodes de Date utilisées sont dépréciées ;-) Il est temps de passer à autre chose.

2
gkephorus