Chaîne à LocalDate

102

Comment puis-je convertir une chaîne en un LocalDate?

J'ai vu des exemples comme:

LocalDate dt = new LocalDate("2005-11-12");

Mais mes cordes sont comme:

2005-nov-12
clankill3r
la source

Réponses:

78

Lorsque vous utilisez Joda Time, vous devez utiliser DateTimeFormatter:

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
final LocalDate dt = dtf.parseLocalDate(yourinput);

Si vous utilisez Java 8 ou une version ultérieure, reportez-vous à la réponse de hertzi

fge
la source
Également soumis une modification pour le format "aaaa-MMM-jj". YYYY est l'année de l'ère et (plus flagrant) DD est le jour de l'année.
Spencer Kormos
la réponse est légèrement fausse ... pour le temps joda, la classe à utiliser est DateTimeFormat, pas DateTimeFormatter. En d'autres termes, appelez DateTimeFormat.ofPattern ("aaaa-MM-jj"). ParseLocalDate (yourInput);
Dan Haywood
188

java.time

Depuis Java 1.8, vous pouvez y parvenir sans bibliothèque supplémentaire en utilisant les classes java.time . Voir le didacticiel .

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
formatter = formatter.withLocale( putAppropriateLocaleHere );  // Locale specifies human language for translating, and cultural norms for lowercase/uppercase and abbreviations and such. Example: Locale.US or Locale.CANADA_FRENCH
LocalDate date = LocalDate.parse("2005-nov-12", formatter);

La syntaxe est cependant presque la même.

Hertzi
la source
java.time.format.DateTimeParseException: Le texte '2005-nov-12' n'a pas pu être analysé à l'index 5
Atte Juvonen
3
Cela se produit parce que votre paramètre régional par défaut s'attend à ce que le «N» de «Nov» soit en majuscules.
hertzi
Voir ma réponse à une question similaire pour plus de détails sur cette approche.
Basil Bourque
14

Vous devrez peut-être passer de DateTime à LocalDate.

Utilisation de Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
la source
2
Notez que cette réponse fait référence à Joda, pas à Java SE.
DavidS
9

Le formatage Datetime est effectué par le org.joda.time.format.DateTimeFormatter class. Trois classes fournissent des méthodes d'usine pour créer des formateurs , et celle-ci en est une. Les autres sont ISODateTimeFormatet DateTimeFormatterBuilder.

DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MMM-dd");
LocalDate lDate = new LocalDate().parse("2005-nov-12",format);

final org.joda.time.LocalDate classest une classe datetime immuable représentant une date sans fuseau horaire . LocalDateest thread-safe et immuable , à condition que la chronologie le soit également. Toutes les classes de chronologie standard fournies sont thread-safe et immuables.

Chandra Sekhar
la source
1

DateTimeFormatter a des formats intégrés qui peuvent être directement utilisés pour analyser une séquence de caractères. Il est sensible à la casse, Nov fonctionnera, mais nov et NOV ne fonctionneront pas:

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MMM-dd");

try {
    LocalDate datetime = LocalDate.parse(oldDate, pattern);
    System.out.println(datetime); 
} catch (DateTimeParseException e) {
    // DateTimeParseException - Text '2019-nov-12' could not be parsed at index 5
    // Exception handling message/mechanism/logging as per company standard
}

DateTimeFormatterBuilderfournit un moyen personnalisé de créer un formateur. Il est insensible à la casse, les novembre, novembre et novembre seront traités de la même manière.

DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
        .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
try {
    LocalDate datetime = LocalDate.parse(oldDate, f);
    System.out.println(datetime); // 2019-11-12
} catch (DateTimeParseException e) {
     // Exception handling message/mechanism/logging as per company standard
}
Prashant singh Chouhan
la source
1
Bienvenue à SO, nous apprécions votre contribution! Veuillez modifier votre réponse et fournir un peu plus d'explications, comment elle se rapporte à la question, d'où vous avez obtenu votre solution, pourquoi cela fonctionne? Pour plus d'informations, consultez stackoverflow.com/help/how-to-answer
B - rian