Формат даты с использованием apache lang DateUtil завершается неудачно
Я пытался преобразовать дату в строковом формате в дату, используя DateUtils
, Ниже приведены мои ожидаемый формат даты,
private static final String[] EXPECTED_DATE_FORMAT = {"yyyy-MM-dd","dd-MM-yyyy","dd-MMM-yyyy",};
И я провел тест на следующие значения,
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("2019-05-18", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-05-2019", EXPECTED_DATE_FORMAT));
System.out.println(org.apache.commons.lang.time.DateUtils.parseDate("18-May-2019", EXPECTED_DATE_FORMAT));
И я получаю следующий результат,
Sat May 18 00:00:00 IST 2019
Tue Nov 09 00:00:00 IST 23
Sat May 18 00:00:00 IST 2019
Почему второе значение?18-05-2019
"не соответствует формату"dd-MM-yyyy
"и получить мне тот же результат? Какие изменения я должен поддержать оба dd-MM-yyyy
а также yyyy-MM-dd
?
2 ответа
Это вызвано тем, что DateUtils.parseDate
внутренне использует SimpleDateFormat
с "мягким разбором" (SimpleDateFormat.setLenient(true)
). Слабый синтаксический анализ означает, примерно, что, если строка не соответствует точно шаблону, анализатор пытается эвристически "угадать", как интерпретировать вашу строку, чтобы получить какую-то значимую дату. В вашем примере вторая строка завершается неудачно, потому что первый шаблон считается "достаточно хорошим" для использования, а затем анализатор все портит.
Ты можешь использовать DateUtils.parseDateStrictly
отключить снисходительность.
Вместо этого вы должны использовать метод DateUtils#parseDateStrictly