Как строго анализировать дату только с годом и номером недели, когда первый день этой недели приходится на предыдущий год?

Моя цель - иметь строгий синтаксический анализ (и запретить такие даты, как '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 (который будет первым днем ​​недели в указанном году)?

10
задан wattostudios 30 April 2012 в 13:23
поделиться