2012-01-05 1 views
72

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

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

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

Но мои строки, как:

2005-nov-12 

ответ

62

Как вы используете Joda время, вы должны использовать DateTimeFormatter:

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

При использовании Java 8 или более поздней версии, то обратитесь к hertzi's answer

+1

+1 для использования DateTimeFormatter.parseLocalDate(), хотя пользователь ищет 3-буквенный месяц. –

+1

Упс ... Исправлено, спасибо (научит меня читать дальше) – fge

+0

Также представлено редактирование формата «yyyy-MMM-dd». ГГГГ - год эры, и (более вопиюще) ДД - это день года. –

10

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

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

спасибо. это прекрасно, когда вы используете более старые версии, которые не имеют «LocalDate.parse» и «DateTimeFormatter.parseLocalDate» – thedarklord47

6

Datetime форматирование выполняется 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 является поточно-безопасным и неизменным, при условии, что Хронология также. Все стандартные классы хронологии, поставляемые, являются потокобезопасными и неизменяемыми.

132

Поскольку Java 1.8, вы можете добиться этого без дополнительной библиотеки:

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

Синтаксис почти такой же, хотя.

+0

java.time.format.DateTimeParseException: текст «2005-нов-12» не может быть проанализирован по индексу 5 –

+3

Это происходит потому, что ваш стандарт по умолчанию ожидает, что «N» в «Нове» будет верхним регистром. – hertzi

+0

См. [Мой ответ] (http://stackoverflow.com/a/38904830/642706) на аналогичный вопрос для более подробного обсуждения этого подхода. –