web-dev-qa-db-fra.com

Impossible d'analyser la chaîne vers LocalDate (Java 8)

Mon entrée est une représentation sous forme de chaîne d'une date au format "01-07-2015" pour le 1er juillet 2015. J'essaie d'analyser ceci dans un Java.time.LocalDate variable:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY");
final String input = "01-07-2015";
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT);

Basé sur le DateTimeFormatter JavaDoc , je m'attendrais à ce que cela fonctionne. Cependant, je suis accueilli par un message très amical et utile:

Causée par: Java.time.DateTimeException: impossible d'obtenir LocalDate de TemporalAccessor: {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [MONDAY, 4]] = 2015}, ISO de type Java.time.format.Parsed

Je ne comprends pas vraiment ce que cette exception me dit. Quelqu'un peut-il m'expliquer ce qui ne va pas?

26
mthmulders

Pour l'année, vous devez utiliser le y minuscule:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");

Y majuscule est utilisé pour la semaine. Voir javadoc de DateTimeFormatter pour plus de détails.

35
Jens

La réponse à la question est d'utiliser "y" et non "Y".

Pour expliquer le message d'erreur, décomposons-le:

Unable to obtain LocalDate from TemporalAccessor

Cela signifie qu'il ne peut pas créer un LocalDate (ce qui a été demandé) à partir d'un TemporalAccessor (l'interface de bas niveau qui fournit un accès de type hashmap aux champs de date/heure).

of type Java.time.format.Parsed

Cela signifie que l'objet passé dans la méthode était de type Java.time.format.Parsed. Il s'agit du type d'analyse de sortie standard et contient toutes les informations analysées.

{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO

Il s'agit de la forme toString() de l'objet Java.time.format.Parsed Résultant de l'analyse. Il dit que quatre choses ont été analysées:

  • DayOfMonth=1, Le jour du mois analysé avec la valeur de 1
  • MonthOfYear=7, Le mois de l'année analysé avec la valeur de 7
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015, L'année de la semaine analysée avec la valeur de 2015
  • ISO, qui est le système de calendrier ISO (une valeur par défaut)

Puisqu'il n'est pas possible de produire un LocalDate à partir de la combinaison DayOfMonth + MonthOfYear + WeekBasedYear, une exception est levée.

Notez que la partie [WeekFields[MONDAY,4]] Fait référence au fait qu'il existe de nombreuses façons différentes de définir une semaine, dans les semaines américaines commencent le dimanche, mais dans la norme ISO et l'UE, elles commencent le lundi.

18
JodaStephen