Xpoint
   [напомнить пароль]

SimpleDateFormat - проблема с парсингом мусора в конце строки

Метки: [без меток]
[арх]
2007-01-31 16:08:20 [обр] Troum[досье]

Добрый день. Есть вопрос по использованию SimpleDateFormat в качестве валидатора. Ситуация такая:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setLenient(false);

String source = "24/01/2007";

Date date = null;

try {
  date = format.parse(source);
} catch (ParseException e) {
  e.printStackTrace();  
}

Если парсить строку "24h/01/2007", то вылетает ParseException - все в порядке.
Но для строки "24/01/20dsf07" парсинг происходит нормально и результирующий Date имеет вид Wed Jan 24 00:00:00 EET 20. Т.е парсер вязл две первые цифры года, а остальное все отбросил.
Как же заставить его валидировать 4-х значное значение года?

спустя 19 часов [обр] Top manager(0/2)[досье]
Troum[досье] а зачем? Если можно 2007 представить как 07? Ведь -это проще. Чем терять время и заморачиваться на решении этого глюка.
спустя 4 часа 21 минуту [обр] Владимир Хоменко(2/67)[досье]
Можно извращаться, если очень нужно, как-нибудь так:
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy ");
...
String source = "24/01/2007 ";
...
спустя 3 дня [обр] 30-ый(59/584)[досье]

Можно убедится, что в конце ничего не было отброшено (предварительный "trim" только не забудьте):

ParsePosition pp = new ParsePosition(0);
Date day = format.parse(s, pp);
if (pp.getIndex() == s.length()) {
    return day;
} else {
    throw new ParseException(...)
}

Или вот из хелпа:

By default, parsing is lenient: If the input is not in the form used by this object's format method but can still be parsed as a date, then the parse succeeds. Clients may insist on strict adherence to the format by calling setLenient(false).
спустя 5 дней [обр] Troum[досье]
30-ый[досье], спасибо. Похоже это - самый реальных выход из ситуации
Powered by POEM™ Engine Copyright © 2002-2005