Stringa a LocalDate


102

Come posso convertire una stringa in a LocalDate?

Ho visto esempi come:

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

Ma le mie corde sono come:

2005-nov-12

Risposte:


78

Mentre usi Joda Time, dovresti usare DateTimeFormatter:

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

Se utilizzi Java 8 o versioni successive, fai riferimento alla risposta di hertzi


Inoltre ha inviato una modifica per il formato "aaaa-MMM-gg". AAAA è l'anno dell'era e (più egregiamente) GG è il giorno dell'anno.
Spencer Kormos

la risposta è leggermente sbagliata ... per l'ora joda, la classe da usare è DateTimeFormat, non DateTimeFormatter. In altre parole, chiama DateTimeFormat.ofPattern ("yyyy-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood

188

java.time

A partire da Java 1.8, puoi ottenere ciò senza una libreria aggiuntiva utilizzando le classi java.time . Vedi 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);

La sintassi è quasi la stessa però.


java.time.format.DateTimeParseException: impossibile analizzare il testo "2005-nov-12" all'indice 5
Atte Juvonen

3
Ciò accade perché le impostazioni internazionali predefinite prevedono che la "N" di "Nov" sia maiuscola.
hertzi

Vedere la mia risposta a una domanda simile per ulteriori discussioni su questo approccio.
Basil Bourque

14

Potrebbe essere necessario passare da DateTime a LocalDate.

Utilizzando Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();

2
Nota che questa risposta si riferisce a Joda, non a Java SE.
DavidS

9

La formattazione data / ora viene eseguita da org.joda.time.format.DateTimeFormatter class. Tre classi forniscono metodi di fabbrica per creare formattatori , e questo è uno. Gli altri sono ISODateTimeFormate DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classè una classe datetime immutabile che rappresenta una data senza fuso orario . LocalDateè thread-safe e immutabile , a condizione che lo sia anche la cronologia . Tutte le classi di cronologia standard fornite sono thread-safe e immutabili.


1

DateTimeFormatter ha formati incorporati che possono essere utilizzati direttamente per analizzare una sequenza di caratteri. È sensibile al maiuscolo / minuscolo, Nov funzionerà tuttavia nov e NOV non funzionerà:

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
}

DateTimeFormatterBuilderfornisce un modo personalizzato per creare un formattatore. Non fa distinzione tra maiuscole e minuscole, Nov, nov e NOV saranno trattati allo stesso modo.

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
}

1
Benvenuto in SO, apprezziamo il tuo contributo! Modifica la tua risposta e fornisci qualche spiegazione in più, in che modo è correlata alla domanda, da dove hai preso la soluzione, perché funziona? Per ulteriori informazioni vedi stackoverflow.com/help/how-to-answer
B - Rian
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.