Разбор неоднозначных дат в Java - PullRequest
2 голосов
/ 12 октября 2009

Есть ли в Java способ угадать формат даты, если он явно не определен?

Например, пользователь вводит 11Mar09, 11-09-2009, 11/09/2009 или 11-09, каков наилучший способ синтаксического анализа этого объекта Date без кучки try catch или выдачи ошибки?

Ответы [ 4 ]

7 голосов
/ 12 октября 2009

Я не думаю, что вы хотите сделать это, особенно на основе ваших примеров, но если вам нужно, я думаю, что вам лучше всего будет использовать что-то вроде Apache DateUtils в commons-lang:

String[] datePatterns = new String[] {
  "ddMMMyy",    // ex. 11Mar09
  "dd-MM-yyyy", // ex. 11-09-2009
  "dd/MM/yyyy", // ex. 11/09/2009
  "dd-MM"       // ex. 11-09 
}

Date date = DateUtils.parseDate(stringDate, datePatterns);
1004
5 голосов
/ 12 октября 2009

Моя рекомендация не . Используйте сборщик даты или явно указанный формат. Гадание приведет ко всем видам проблем, включая, если дата является критической, судебный процесс.

Если у вас есть угадать, предоставьте некую двусмысленную форму обратной связи, например, страницу подтверждения с надписью «Ваш рейс будет забронирован 9 ноября 2009 года. Это правильно?» ?».

2 голосов
/ 12 октября 2009

Вы можете иметь кучу регулярных выражений и циклически проходить, пока не найдете совпадение. Я думаю, что вы также можете иметь несколько DateFormats и циклически проходить через них, ловя исключения на тех, которые не удалось.

Первое исключает использование исключений для неисключительных случаев, второе, возможно, лучше с точки зрения разработки, поскольку вы используете инфраструктуру синтаксического анализа даты, для которой она была разработана. Но в целом, я не думаю, что какой-либо из подходов обязательно является «лучшим» или «худшим» сам по себе - скорее, это вопрос личных предпочтений / убеждений.

1 голос
/ 12 октября 2009

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

Вы не даете никаких подсказок о вашем пользовательском интерфейсе, но лучший подход здесь - помочь пользователю ввести дату. Например, с помощью всплывающего календаря или просто принудительно заданного формата.

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