Мой совет всегда выключать снисхождение. Я не могу вспомнить случай, когда вы хотите снисхождения, и этот параметр никогда не должен был использоваться по умолчанию для таких классов, как SimpleDateFormat. Простая обработка может интерпретировать мусор как допустимые временные строки и выявляет ошибки, которые могут быть трудно обнаружить при тестировании. Кроме того, если вы используете снисходительный, чтобы терпеть изменения в формате времени, вы будете обожжены. Например:
System.out.println(new SimpleDateFormat("yyyyMMdd").parse("2010-12-30"));
Дает это (ваш часовой пояс может отличаться):
Mon Nov 02 00:00:00 EST 2009
Этот абсурдный результат выглядит как минус один месяц ("-1"), второй день ("2-") 2010 года. Нулевой месяц - декабрь!
К сожалению, использование setLenient (false) не приводит к строгой интерпретации шаблона. SimpleDateFormat будет переносить мусор после сопоставления с шаблоном, как обсуждено здесь:
SimpleDateFormat.parse () игнорирует количество символов в шаблоне
Кроме того, оно не является строгим в отношении количества символов шаблона, таких как «d» вместо «dd»:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
System.out.println("For 5: " + sdf.parse("2010/01/5"));
System.out.println("For 05: " + sdf.parse("2010/01/05"));
System.out.println("For 15: " + sdf.parse("2010/01/15"));
Урожайность:
For 5: Tue Jan 05 00:00:00 EST 2010
For 05: Tue Jan 05 00:00:00 EST 2010
For 15: Fri Jan 15 00:00:00 EST 2010
Также с setLenient (false) «2010/01/5» принимается с шаблоном «гггг / мм / дд». И несогласованность данных игнорируется, например, «1999/2011» с шаблоном «гггг / гггг» (ответ 2011).
Использование SimpleDateFormat для проверки строк даты / времени, к сожалению, ненадежно. Если вы перейдете по ссылке выше, вы увидите некоторые решения, в том числе более строгую версию SimpleDateFormat, написанную мной!