Неверный формат строки синтаксического анализа для JodaTime

String dateString = "20110706 1607";
    DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("YYYYMMDD HHMM");
    DateTime dateTime = dateStringFormat.parseDateTime(dateString);

Полученная трассировка стека:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "201107206 1607" is malformed at " 1607"
    at org.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:644)
    at org.joda.time.convert.StringConverter.getInstantMillis(StringConverter.java:65)
    at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:171)
    at org.joda.time.DateTime.<init>(DateTime.java:168)
......

Какие-нибудь мысли? Если я усекаю строку до 20110706 с шаблоном «ГГГГММДД», это работает, но мне также нужны значения часов и минут. Что странно, так это то, что я могу без проблем преобразовать Jodatime DateTime в строку, используя тот же шаблон «ГГГГММДД ЧЧММ».

Спасибо за поиск


person RandomUser    schedule 16.08.2011    source источник
comment
Не думаю, что это проблема, но второй набор ММ должен быть мм   -  person Jim    schedule 16.08.2011
comment
Текст сообщения об ошибке не соответствует введенной вами строке. Действительно есть ли вторая цифра 2 в части года/месяца/дня? (201107206)   -  person Jon Skeet    schedule 16.08.2011
comment
Проблема решена, я использовал неправильный шаблон форматирования, который вводил дополнительные символы в строку даты (см. Stacktrace). Спасибо, мистер Скит!   -  person RandomUser    schedule 16.08.2011


Ответы (1)


Посмотрите на свой шаблон - вы дважды указываете «ММ». Это не может быть правильным. Это было бы попыткой дважды проанализировать одно и то же поле (в данном случае месяц) из двух разных битов текста. Что бы вы ожидали выиграть? Ты хочешь:

DateTimeFormat.forPattern("yyyyMMdd HHmm")

Посмотрите документацию для DateTimeFormat, чтобы узнать, что все значит.

Обратите внимание, что хотя вызов toString с этим шаблоном создаст строку, он не будет создавать строку, которую вы нужно получить. Я не удивлюсь, если из-за корпуса в выводе будут даже «ГГГГ» и «ДД», хотя я не могу проверить это прямо сейчас. По крайней мере, у вас будет месяц дважды, а не минуты, появляющиеся в конце.

person Jon Skeet    schedule 16.08.2011