String to LocalDate

Как преобразовать строку в LocalDate?

Я видел примеры вроде:

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

Но мои строки похожи на:

2005-nov-12

Ответ 1

Поскольку вы используете Joda Time, вы должны использовать DateTimeFormatter:

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

Если используется Java 8 или более поздняя версия, обратитесь к ответу Герца.

Ответ 2

java.time

Начиная с Java 1.8, вы можете достичь этого без дополнительной библиотеки, используя классы java.time. Смотрите учебник.

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

Хотя синтаксис почти такой же.

Ответ 3

Возможно, вам придется перейти с DateTime на LocalDate.

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

Ответ 4

Форматирование даты и времени выполняется с помощью org.joda.time.format.DateTimeFormatter class. Три класса предоставляют методы factory для создания форматировщиков, и это одно. Остальные - ISODateTimeFormat и DateTimeFormatterBuilder.

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

final org.joda.time.LocalDate class - это неизменный класс datetime, представляющий дату без часового пояса. LocalDate является потокобезопасным и неизменным, при условии, что Хронология также. Все стандартные классы хронологии, поставляемые, являются потокобезопасными и неизменяемыми.

Ответ 5

DateTimeFormatter имеет встроенные форматы, которые можно напрямую использовать для анализа последовательности символов. Это чувствительный к регистру, ноябрь будет работать, однако, нов и NOV не будет работать:

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
}

DateTimeFormatterBuilder предоставляет собственный способ создания форматера. Это без учета регистра, ноябрь, ноябрь и ноябрь будут рассматриваться как одинаковые.

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
}