Zeichenfolge zu LocalDate

102

Wie kann ich einen String in einen konvertieren LocalDate?

Ich habe Beispiele gesehen wie:

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

Aber meine Saiten sind wie:

2005-nov-12
clankill3r
quelle

Antworten:

78

Wenn Sie Joda Time verwenden, sollten Sie Folgendes verwenden DateTimeFormatter:

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

Wenn Sie Java 8 oder höher verwenden, lesen Sie die Antwort von hertzi

fge
quelle
Auch eine Bearbeitung für das Format "JJJJ-MMM-TT" eingereicht. JJJJ ist das Jahr der Ära, und (ungeheuerlicher) TT ist der Tag des Jahres.
Spencer Kormos
Die Antwort ist etwas falsch ... für joda time ist die zu verwendende Klasse DateTimeFormat, nicht DateTimeFormatter. Mit anderen Worten, rufen Sie DateTimeFormat.ofPattern ("JJJJ-MM-TT") auf. ParseLocalDate (yourInput);
Dan Haywood
188

java.time

Seit Java 1.8 können Sie dies ohne zusätzliche Bibliothek mithilfe der Klassen java.time erreichen . Siehe Tutorial .

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

Die Syntax ist jedoch fast dieselbe.

Herttzi
quelle
java.time.format.DateTimeParseException: Text '2005-nov-12' konnte bei Index 5 nicht analysiert werden
Atte Juvonen
3
Dies liegt daran, dass Ihr Standardgebietsschema erwartet, dass das 'N' von 'Nov' in Großbuchstaben geschrieben wird.
Hertzi
Weitere Informationen zu diesem Ansatz finden Sie in meiner Antwort auf eine ähnliche Frage.
Basil Bourque
14

Möglicherweise müssen Sie von DateTime zu LocalDate wechseln.

Verwenden der Joda-Zeit:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
quelle
2
Beachten Sie, dass sich diese Antwort auf Joda bezieht, nicht auf Java SE.
DavidS
9

Die Datetime-Formatierung wird von der durchgeführt org.joda.time.format.DateTimeFormatter class. Drei Klassen bieten Factory-Methoden zum Erstellen von Formatierern , und dies ist eine. Die anderen sind ISODateTimeFormatund DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classist eine unveränderliche datetime-Klasse, die ein Datum ohne Zeitzone darstellt . LocalDateist threadsicher und unveränderlich , vorausgesetzt, die Chronologie ist auch. Alle mitgelieferten Standard-Chronologieklassen sind threadsicher und unveränderlich.

Chandra Sekhar
quelle
1

DateTimeFormatter verfügt über integrierte Formate, mit denen eine Zeichenfolge direkt analysiert werden kann. Es ist case sensitive, Nov wird funktionieren, aber nov und NOV werden nicht funktionieren:

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
}

DateTimeFormatterBuilderbietet eine benutzerdefinierte Möglichkeit zum Erstellen eines Formatierers. Es wird zwischen Groß- und Kleinschreibung unterschieden, Nov, Nov und NOV werden gleich behandelt.

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
quelle
1
Willkommen bei SO, wir freuen uns über Ihre Beiträge! Bitte bearbeiten Sie Ihre Antwort und geben Sie ein bisschen mehr Erklärungen, wie sie sich auf die Frage bezieht, woher Sie Ihre Lösung haben und warum sie funktioniert. Weitere Anleitungen finden Sie unter stackoverflow.com/help/how-to-answer
B - rian