Joda time: comment convertir String en LocalDate?

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

Construction DateTime échoue:

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

avec l'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 formatage pour LocalDate . Quelle est la meilleure façon de convertir String dateString = "2009-04-17"; en LocalDate (ou quelque chose d'autre si ce n'est pas le droit de représentation)

merci...

42
demandé sur Hank Gay 2010-04-27 17:32:46

6 réponses

Vous êtes probablement à la recherche d' LocalDate(Object). C'est un peu déroutant, car il prend un générique Object, mais les docs 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
répondu Hank Gay 2014-11-21 21:51:32

parse(String) méthode.

LocalDate date = LocalDate.parse("2009-04-17");
17
répondu JodaStephen 2013-08-22 11:05:05

l'utilisation de LocalDate.parse() ou new LocalDate(). Un morceau de code vaut mille mots. Dans l'exemple suivant dans le rapport scala je voulais obtenir une date locale dans un format de chaîne de caractères yyyyMMdd. LocalDate.parse() est heureux de me donner une instance de LocalDate, mais ce n'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 le donne le 2 février 2016 dans le format AAAAMMJJ et je récupère une date du 1er janvier 20120202. Je vais aller sur une branche ici: je ne pensez pas que ce est ce qu'elle doit faire. Joda utilise 'yyyy-MM-dd' comme valeur par défaut, mais accepte implicitement une chaîne sans caractère' -', pensant que vous voulez le 1er janvier de cette année? Cela ne ressemble pas à un comportement par défaut raisonnable pour moi.

compte tenu de cela, il me semble que l'utilisation d'un Joda date formatter qui ne peut pas être si facilement trompé est une meilleure solution pour analyser une chaîne. En outre, LocalDate.parse() devrait probablement jeter 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 causera l'échec d'autres formats pour que vous ne receviez pas ce comportement étrange de buggy:

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 retourner une date dans l'année 20120202.

8
répondu Kevin Won 2016-02-12 00:41:13

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
répondu Mikhail Batcer 2016-02-12 06:58:56

Cela a fonctionné pour moi:

LocalDate d1 = LocalDate.parse("2014-07-19");
LocalDate dNow = LocalDate.now();  // Current date
1
répondu CharlesF 2014-07-13 19:27:04

Vous pouvez utiliser LocalDate.of l'année, le mois et le jour passé en tant que distincts des arguments:

LocalDate date1 = LocalDate.of(2009, 4, 17);
LocalDate date2 = LocalDate.of(2009, Month.APRIL, 17);
1
répondu computered 2015-12-07 12:42:02