Я столкнулся с очень странным поведением при использовании 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"
, но строкаразбирается в формате "yyyy-MM-dd"
.Я ожидал бы, что такая вещь приведет к ParseException
, или, по крайней мере, будет проанализирована на основе максимальных усилий правильно .Вместо этого по какой-то странной причине дата анализируется как 2011-11-02
.Эх!
Это недопустимо, поскольку одна ошибка при обработке входных данных может привести к чему-то совершенно неожиданному / разрушительному.Тем временем перешел на JodaTime, но было бы неплохо понять, что там пошло не так.