Я столкнулся с очень странным поведением при использовании SimpleDateFormat
для синтаксического анализа строки до даты. Рассмотрим следующий модульный тест:
@Test
public void testParse() throws ParseException
{
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String dateStr = "2012-12-21";
Date parsedDate = dateFormat.parse(dateStr);
Calendar date = Calendar.getInstance();
date.setTime(parsedDate);
Assert.assertEquals(2012, date.get(Calendar.YEAR));
Assert.assertEquals(11, date.get(Calendar.MONTH)); // yeah, Calendar sucks
Assert.assertEquals(21, date.get(Calendar.DAY_OF_MONTH));
}
Как видно, в приведенном выше коде имеется намеренная ошибка : SimpleDateFormat
инициализируется с помощью «yyyyMMdd»
но строка для анализа имеет формат «гггг-ММ-дд»
. Я ожидал, что такая вещь приведет к ParseException
, или, по крайней мере, будет правильно проанализирована с максимальной эффективностью . Вместо этого по какой-то странной причине дата анализируется как 2011-11-02
. Э?!
Это недопустимо, поскольку одна-единственная ошибка при обработке входных данных может привести к чему-то совершенно неожиданному / разрушительному. Тем временем перешел на JodaTime, но было бы неплохо понять, что там пошло не так.