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);