2013-03-26 1 views
10

Нельзя ли String отформатировать с DateTimeFormatter с помощью LocalDateTime.parse()?Время в Joda - Разбор строк строк java.lang.IllegalArgumentException

Тест

DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis() 
LocalDateTime ldt = new LocalDateTime() 
String val = ldt.toString(formatter) 
System.out.println(val) //2013-03-26T13:10:46 
// parse() throws java.lang.IllegalArgumentException: Invalid format: "2013-03-26T13:10:46" is too short 
LocalDateTime nldt = LocalDateTime.parse(val, formatter) 
+3

Я бы сказал, что это ошибка с JodaTime. Он должен разбирать любую строку с форматом, а также форматировать - объект DateTimeFormatter, которого не происходит. –

ответ

8

Посмотрите на JavaDoc:

Возвращает базовый форматчик, который сочетает в себе базовую дату и время без Millis, разделенных «T» (yyyyMMdd'T'HHmmssZ). Смещение часового пояса - «Z» для нуля и формы «± HHmm» для ненулевого. По умолчанию синтаксический анализатор строгий, поэтому строка 24:00 не может быть проанализирована.

Ключ здесь, кажется, часовой пояс смещение «Z», на ноль, а в виде «± HHMM» для ненулевого. Время Joda, очевидно, ожидает информацию о часовом поясе для parse().

Я приложил "Z" к вашей разобранной строки даты, и она работает лучше:

DateTimeFormatter formatter = ISODateTimeFormat.dateTimeNoMillis(); 
LocalDateTime ldt = new LocalDateTime(); 
String val = ldt.toString(formatter); 
System.out.println(val);  
val += "Z"; 
LocalDateTime nldt = LocalDateTime.parse(val, formatter); 
System.out.println(nldt.toString()); 

Выход:

2013-03-26T17:50:06 
2013-03-26T17:50:06.000 
2

Форматировщик также бросает ошибку, если formatter.parseLocalDateTime(val) называется, что и LocalDateTime.parse(...) звонит непосредственно (то есть, наивный вызов).

Итак, это фактор ожидаемого формата, который в этом случае равен yyyy-MM-dd'T'HH:mm:ssZZ; в основном, он жалуется, что вы не прошли часовой пояс.

Я не знаю, действительно ли это квалифицируется как «ошибка»; в краткосрочной перспективе, очевидно, может использоваться пользовательский формат или посмотреть на ISODateTimeFormat.localDateOptionalTimeParser(), который, как представляется, является тем, что вы хотите (это парсер по умолчанию, используемый LocalDateTime).