Comment spécifier la chaîne de format pour convertir la date seule à partir de la chaîne. Dans mon cas, seule la partie date est pertinente
La construction en tant que DateTime
échoue:
String dateString = "2009-04-17";
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime dateTime = formatter.parseDateTime(dateString);
avec erreur Java.lang.IllegalArgumentException: Invalid format: "2011-04-17" is too short
Probablement parce que je devrais utiliser LocalDate
à la place. Mais, je ne vois aucun formateur pour LocalDate
. Quelle est la meilleure façon de convertir String dateString = "2009-04-17";
en 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 comment gérer un String
si vous passez un String
au constructeur, par exemple.
LocalDate myDate = new LocalDate("2010-04-28");
Utilisez la méthode parse(String)
.
LocalDate date = LocalDate.parse("2009-04-17");
Il y a un problème de bogue quelque peu subtil avec l'utilisation de LocalDate.parse()
ou new LocalDate()
. Un extrait de code vaut mille mots. Dans l'exemple suivant dans le scala repl je voulais obtenir une date locale dans un format de chaîne aaaaMMjj. LocalDate.parse()
est heureux de me donner une instance d'un LocalDate, mais c'est pas la bonne (new LocalDate()
a le même comportement):
scala> org.joda.time.LocalDate.parse("20120202")
res3: org.joda.time.LocalDate = 20120202-01-01
Je lui donne le 2 février 2016 au format aaaaMMjj et je récupère une date du 1er janvier 20120202. Je sors sur une branche ici: je ne pense pas que c'est ce qu'il devrait faire. Joda utilise 'aaaa-MM-jj' par défaut mais acceptera implicitement une chaîne sans caractère '-', pensant que vous voulez le 1er janvier de cette année? Cela ne me semble pas être un comportement par défaut raisonnable.
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 analyser une chaîne. De plus, LocalDate.parse()
devrait probablement lever 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 d'autres formats afin que vous n'obteniez pas ce comportement de bug 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 sensé que de renvoyer une date dans l'année 20120202.
Dans mon cas, la chaîne entrante peut être dans l'un des deux formats. J'essaie donc d'abord d'analyser la chaîne avec un format plus spécifique:
String 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);