Странное поведение в java.text.SimpleDateFormat при ожидании yyyyMMdd с yyyy-MM-dd

Я столкнулся с очень странным поведением при использовании 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, но было бы неплохо понять, что там пошло не так.

9
задан Raedwald 15 May 2014 в 06:56
поделиться