Моя цель - иметь строгий синтаксический анализ (и запретить такие даты, как '98 / 99 ', например ). Однако, следующий код вызывает исключение java.text.ParseException
с сообщением Unparseable date: «98/01» :
SimpleDateFormat sdf = new SimpleDateFormat("yy/ww");
sdf.setLenient(false);
sdf.parse("98/01");
Это действительно для первой недели 1998 года , который начинается в четверг. Однако анализ недели всегда возвращает дату первого дня этой недели. В этом случае это будет 29.12.1997 . И именно поэтому возникает исключение.
Похоже, эта проблема исходит от класса GregorianCalendar
, а точнее из метода computeTime ()
, который проверяет, соответствуют ли исходные поля поля, устанавливаемые извне, когда синтаксический анализ не снисходительный :
if (!isLenient()) {
for (int field = 0; field < FIELD_COUNT; field++) {
if (!isExternallySet(field)) {
continue;
}
if (originalFields[field] != internalGet(field)) {
// Restore the original field values
System.arraycopy(originalFields, 0, fields, 0, fields.length);
throw new IllegalArgumentException(getFieldName(field));
}
}
}
Это ошибка? Я думаю, что синтаксический анализ 1998/01 действительно должен вернуть 29.12.1997 и не вызывать никаких исключений. Однако знаете ли вы, как вместо этого вернуть результат синтаксического анализа 01.01.1998 (который будет первым днем недели в указанном году)?