Heure Joda: Comment convertir une chaîne en LocalDate?

Comment spécifier la chaîne de format pour convertir la date seule à partir d’une chaîne. Dans mon cas, seule la partie date est pertinente

Construire comme DateTime échoue:

 Ssortingng dateSsortingng = "2009-04-17"; DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); DateTime dateTime = formatter.parseDateTime(dateSsortingng); 

avec l’erreur java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short

Probablement parce que je devrais utiliser LocalDate place. Mais, je ne vois aucun formateur pour LocalDate . Quelle est la meilleure façon de convertir Ssortingng dateSsortingng = "2009-04-17"; dans LocalDate (ou autre chose si ce n’est pas la bonne représentation)

Merci…

Vous recherchez probablement LocalDate(Object) . C’est un peu déroutant car il prend un Object générique, mais les documents indiquent qu’il utilisera un ConverterManager qui sait gérer une Ssortingng si vous transmettez une Ssortingng au constructeur, par exemple

 LocalDate myDate = new LocalDate("2010-04-28"); 

Utilisez la méthode parse(Ssortingng) .

 LocalDate date = LocalDate.parse("2009-04-17"); 

Il y a un problème de bug-ish avec l’utilisation de LocalDate.parse() ou du new LocalDate() . Un extrait de code vaut mille mots. Dans l’exemple suivant dans le fichier scala repl, je voulais obtenir une date locale dans un format de chaîne yyyyMMdd. LocalDate.parse() est heureux de me donner une instance d’un LocalDate, mais ce n’est pas le bon (le new LocalDate() a le même comportement):

 scala> org.joda.time.LocalDate.parse("20120202") res3: org.joda.time.LocalDate = 20120202-01-01 

Je vous le donne le 2 février 2016 dans le format aaaaMMdd et je reviens à la date du 1er janvier 20120202. Je vais m’embarquer ici: je ne pense pas que c’est ce que ça devrait faire. Joda utilise ‘aaaa-MM-jj’ par défaut mais acceptera implicitement une chaîne sans caractères ‘-‘, pensant que vous voulez le 1er janvier de cette année? Cela ne semble pas être un comportement par défaut raisonnable pour moi.

Compte tenu de cela, il me semble que l’utilisation d’un formateur de date joda qui ne peut pas être si facilement trompé est une meilleure solution pour parsingr une chaîne. De plus, LocalDate.parse() devrait probablement lancer une exception si le format de date n’est pas “aaaa-MM-jj”:

 scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyyMMdd") format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@56826a75 scala> org.joda.time.LocalDate.parse("20120202", format) res4: org.joda.time.LocalDate = 2012-02-02 

Cela entraînera l’échec des autres formats afin que vous n’ayez pas ce comportement bizarre:

 scala> val format = org.joda.time.format.DateTimeFormat.forPattern("yyyy-MM-dd") format: org.joda.time.format.DateTimeFormatter = org.joda.time.format.DateTimeFormatter@781aff8b scala> org.joda.time.LocalDate.parse("20120202", format) java.lang.IllegalArgumentException: Invalid format: "20120202" is too short at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900) at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844) at org.joda.time.LocalDate.parse(LocalDate.java:179) ... 65 elided 

ce qui est un comportement beaucoup plus sain que de renvoyer une date en 20120202.

Dans mon cas, la chaîne entrante peut être dans l’un des deux formats. J’essaie donc d’abord d’parsingr la chaîne avec un format plus spécifique:

 Ssortingng s = "2016-02-12"; LocalDateTime ldt; try { ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd HH:mm")); } catch (IllegalArgumentException e) { ldt = LocalDateTime.parse(s, DateTimeFormat.forPattern("YYYY-MM-dd")); } 

Cela a fonctionné pour moi:

 LocalDate d1 = LocalDate.parse("2014-07-19"); LocalDate dNow = LocalDate.now(); // Current date 

Vous pouvez utiliser LocalDate.of avec l’année, le mois et le jour passés comme arguments séparés:

 LocalDate date1 = LocalDate.of(2009, 4, 17); LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);