String para LocalDate

102

Como posso converter uma string em um LocalDate?

Eu vi exemplos como:

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

Mas minhas cordas são como:

2005-nov-12
clankill3r
fonte

Respostas:

78

Ao usar o Joda Time, você deve usar DateTimeFormatter:

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

Se estiver usando Java 8 ou posterior, consulte a resposta de hertzi

fge
fonte
Também enviou uma edição para o formato "aaaa-MMM-dd". YYYY é o ano da era e (mais notoriamente) DD é o dia do ano.
Spencer Kormos
a resposta está um pouco errada ... para o tempo joda, a classe a ser usada é DateTimeFormat, não DateTimeFormatter. Em outras palavras, chame DateTimeFormat.ofPattern ("aaaa-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood
188

java.time

Desde o Java 1.8, você pode conseguir isso sem uma biblioteca extra usando as classes java.time . Veja o 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);

A sintaxe é quase a mesma.

Hertzi
fonte
java.time.format.DateTimeParseException: Texto '2005-nov-12' não pôde ser analisado no índice 5
Atte Juvonen
3
Isso acontece porque seu Locale padrão espera que o 'N' de 'Nov' esteja em maiúsculas.
hertzi de
Veja minha resposta a uma pergunta semelhante para mais discussão sobre essa abordagem.
Basil Bourque
14

Você pode ter que ir de DateTime para LocalDate.

Usando o Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();
Spencer Kormos
fonte
2
Observe que esta resposta se refere a Joda, não a Java SE.
DavidS
9

A formatação de data e hora é executada pelo org.joda.time.format.DateTimeFormatter class. Três classes fornecem métodos de fábrica para criar formatadores , e esta é uma delas. Os outros são ISODateTimeFormate DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate classé uma classe datetime imutável que representa uma data sem fuso horário . LocalDateé thread-safe e imutável , desde que a cronologia também o seja. Todas as classes de cronologia padrão fornecidas são thread-safe e imutáveis.

Chandra Sekhar
fonte
1

DateTimeFormatter possui formatos embutidos que podem ser usados ​​diretamente para analisar uma sequência de caracteres. É sensível a maiúsculas e minúsculas, novembro funcionará, mas novembro e novembro não funcionarão:

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
}

DateTimeFormatterBuilderfornece uma maneira personalizada de criar um formatador. Não diferencia maiúsculas de minúsculas, novembro, novembro e novembro serão tratados da mesma forma.

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
fonte
1
Bem-vindo ao SO, agradecemos sua contribuição! Edite sua resposta e forneça um pouco mais de explicações, como ela se relaciona com a questão, de onde você obteve sua solução, por que ela funciona? Para obter mais orientações, consulte stackoverflow.com/help/how-to-answer
B - rian