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...
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");
parse(String)
méthode.
LocalDate date = LocalDate.parse("2009-04-17");
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.
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
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);