Строка в LocalDate


103

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

Я видел такие примеры:

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

Но мои струны такие:

2005-nov-12

Ответы:


79

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

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

Если вы используете Java 8 или новее, обратитесь к ответу hertzi


Также отправлено изменение для формата «гггг-МММ-дд». ГГГГ - год эры, а ДД (что еще более вопиюще) - день года.
Спенсер Кормос

ответ немного неверен ... для joda time используется класс DateTimeFormat, а не DateTimeFormatter. Другими словами, вызовите DateTimeFormat.ofPattern ("гггг-ММ-дд"). ParseLocalDate (yourInput);
Дэн Хейвуд

189

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

Однако синтаксис почти такой же.


java.time.format.DateTimeParseException: текст '2005-nov-12' не может быть проанализирован в индексе 5
Атте Ювонен,

3
Это происходит потому, что ваша локаль по умолчанию предполагает, что «N» в «Nov» будет в верхнем регистре.
hertzi

См. Мой ответ на аналогичный вопрос для более подробного обсуждения этого подхода.
Basil Bourque

14

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

Использование Joda Time:

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

2
Обратите внимание, что этот ответ относится к Joda, а не к Java SE.
DavidS

9

Форматирование даты и времени выполняется org.joda.time.format.DateTimeFormatter class. Три класса предоставляют фабричные методы для создания средств форматирования , и это один. Остальные - 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является потокобезопасным и неизменяемым , при условии, что Хронология тоже. Все стандартные классы Chronology являются поточно-ориентированными и неизменяемыми.


1

DateTimeFormatter имеет встроенные форматы, которые можно напрямую использовать для анализа последовательности символов. Это чувствительно к регистру, Nov будет работать, но nov и 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
}

1
Добро пожаловать в SO, мы ценим ваш вклад! Отредактируйте свой ответ и дайте немного дополнительных пояснений, как это связано с вопросом, откуда вы взяли свое решение, почему оно работает? Для получения дополнительной информации см. Stackoverflow.com/help/how-to-answer
B -
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.