Cadena a LocalDate

102

¿Cómo puedo convertir una cadena en a LocalDate?

He visto ejemplos como:

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

Pero mis cuerdas son como:

2005-nov-12
clankill3r
fuente

Respuestas:

78

Mientras usa Joda Time, debe usar DateTimeFormatter:

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

Si usa Java 8 o posterior, consulte la respuesta de hertzi

fge
fuente
También envió una edición para el formato "aaaa-MMM-dd". YYYY es el año de la era y (más atrozmente) DD es el día del año.
Spencer Kormos
la respuesta es un poco incorrecta ... para joda time, la clase a usar es DateTimeFormat, no DateTimeFormatter. En otras palabras, llame a DateTimeFormat.ofPattern ("aaaa-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood
188

java.time

Desde Java 1.8, puede lograr esto sin una biblioteca adicional utilizando las clases java.time . Ver 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);

Sin embargo, la sintaxis es casi la misma.

Hertzi
fuente
java.time.format.DateTimeParseException: el texto '2005-nov-12' no se pudo analizar en el índice 5
Atte Juvonen
3
Esto sucede porque su configuración regional predeterminada espera que la 'N' de 'Nov' esté en mayúsculas.
Hertzi
Consulte mi Respuesta a una pregunta similar para obtener más información sobre este enfoque.
Basil Bourque
14

Puede que tenga que pasar de DateTime a LocalDate.

Usando Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
fuente
2
Tenga en cuenta que esta respuesta se refiere a Joda, no a Java SE.
DavidS
9

El formato de fecha y hora lo realiza org.joda.time.format.DateTimeFormatter class. Tres clases proporcionan métodos de fábrica para crear formateadores , y esta es una. Los otros son ISODateTimeFormaty DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classes una clase de fecha y hora inmutable que representa una fecha sin zona horaria . LocalDatees seguro para subprocesos e inmutable , siempre que la cronología también lo sea. Todas las clases de cronología estándar suministradas son seguras para subprocesos e inmutables.

Chandra Sekhar
fuente
1

DateTimeFormatter tiene formatos incorporados que se pueden usar directamente para analizar una secuencia de caracteres. Se distingue entre mayúsculas y minúsculas, noviembre funcionará, pero nov y NOV no funcionarán:

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
}

DateTimeFormatterBuilderproporciona una forma personalizada de crear un formateador. No distingue entre mayúsculas y minúsculas, nov, nov y NOV se tratarán de la misma manera.

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
fuente
1
¡Bienvenido a SO, agradecemos sus comentarios! Edite su respuesta y proporcione un poco más de explicaciones, cómo se relaciona con la pregunta, de dónde obtuvo su solución, por qué funciona? Para obtener más orientación, consulte stackoverflow.com/help/how-to-answer
B - rian