почему при разборе этой строки даты возникает исключение непарсируемой даты? - PullRequest
0 голосов
/ 09 октября 2008

Я использую SimpleDateFormat с шаблоном EEE MM/dd hh:mma, передавая строку даты Thu 10/9 08:15PM, и она вызывает исключение Unparseable date. Зачем? Ранее я использовал различные шаблоны с SimpleDateFormat, поэтому я довольно хорошо знаком с его использованием. Может быть, я упускаю что-то очевидное из-за того, что слишком долго на него смотрю.

Другая возможность - фанки (технический термин). Контекст представляет собой приложение для очистки экрана, где я использую HtmlCleaner, чтобы навести порядок в грязном HTML. Хотя я считаю, что HtmlCleaner в целом довольно хорош, я заметил странные проблемы с символами, которые выглядят как пробелы, но не распознаются как таковые, например, в StringTokenizer. Я в основном работал над этим и не копался в кодировке символов или чем-то подобном, но начинаю удивляться.

Ответы [ 3 ]

2 голосов
/ 09 октября 2008

Чтобы проверить, является ли это форматом даты, напишите тестовый класс, чтобы доказать это. Для таких вещей мне нравится использовать bsh (beanshell). Вот мой тест:

sdf = new java.text.SimpleDateFormat("EEE MM/dd hh:mma");
System.out.println(sdf.format(sdf.parse("Thu 10/9 08:15PM")));

Который вывел: пт 10/09 08:15 вечера

Итак, по крайней мере, с моей версией jdk / jre (1.6) строки формата, кажется, работают просто отлично. я думаю, что следующий шаг - убедиться, что строка, с которой вы имеете дело, именно то, что вы думаете. Можете ли вы добавить запись в ваш код и вывести входную строку в файл журнала? Затем вы можете посмотреть на это в хорошем текстовом редакторе, запустить его через свой тестовый класс или посмотреть на него в шестнадцатеричном редакторе, чтобы убедиться, что это обычный текст.

Удачи!

2 голосов
/ 09 октября 2008

Первый вопрос здесь, на StackOverFlow, поэтому я не уверен, как правильно пометить это как разрешенное. Большинство ответов в комментариях к ответу Эрика.

Основной причиной был символ «пробел» в строке даты, который не был распознан как таковой. Это был шестнадцатеричный символ 'A0', который является неразрывным пробелом. В итоге я преобразовал строку даты в массив char, проверил символы с помощью Character.isSpaceChar () и заменил те, которые вернули true, символом "".

1 голос
/ 09 октября 2008

Попробуйте вместо этого свой шаблон:

EEE MM/d hh:mma

Разница в одном d вместо двойного dd, поскольку ваша дата 10/9 вместо 10/09.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...