2015-12-17 6 views
1

Я пытаюсь создать объект LocalDate, используя библиотеку JodaTime, из строки ввода. Строка поступает из базы данных, в которой я не контролирую. Дата ввода рождения выглядит точно так:Joda-Time create LocalDate from String с шаблоном

1963-07-19T00:00:00.000+0000 

Я просто хочу 1963-07-19 части, я не хочу время части. Так что я пытался реализовать форматировщик так:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd"); 

А затем создать объект LocalDate как так:

LocalDate dob = formatter.parseLocalDate(dateOfBirth); 

Но я получаю ошибку:

Invalid format: "1963-07-19T00:00:00.000+0000" is malformed at "T00:00:00.000+0000" 

Я также попробовал форматировать следующим образом:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZ"); 

Но затем я получаю ошибку:

Cannot parse "1963-07-19T00:00:00.000+0000": Value 0 for clockhourOfHalfday must be in the range [1,12] 

И идея, как добиться того, что я хочу?

ответ

2

Ваш первый пример не будет работать, потому что parseLocalDate должен соответствовать всей строке ввода шаблону.

Для вашего второго примера, в соответствии с javadoc of DateTimeFormat, образец письма h определяет

h  clockhour of halfday (1~12) number  12 

Похоже, что вы хотите

H  hour of day (0~23)   number  0 
+0

Отлично, это сработало. Я просто беспокоюсь, что БД вернет что-то более странное позже и проржет прог. Скрещенные пальцы. – Richard

+0

@richard Если вам нужно, jodatime позволяет вам определять несколько парсеров. См. [Здесь] (http://stackoverflow.com/questions/3307330/using-joda-date-time-api-to-parse-multiple-formats). –

1

Дата вы показали это в стандартном формате - Стандарт ISO8601.

Joda-Time имеет специальный класс для создания DateTimeFormatter объектов для данного конкретного стандарта - класс ISODateTimeFormat.

Таким образом, вы можете сделать это:

DateTimeFormatter formatter = ISODateTimeFormat.dateTime(); 
LocalDate dob = formatter.parseLocalDate(theDate); 

Смотрите documentation для других методов, связанных с различными вариантами формата даты ISO-8601. Для конкретной строки, которую вы показали, должен работать метод dateTime().