web-dev-qa-db-fra.com

Heure Joda: Comment convertir String en LocalDate?

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...

44
bsr

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");
52
Hank Gay

Utilisez la méthode parse(String).

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

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.

9
Kevin Won

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"));
}
4
Mikhail Batcer

Cela a fonctionné pour moi:

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

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