Java дата странность - PullRequest
       1

Java дата странность

2 голосов
/ 30 ноября 2010

Из любопытства, почему я получаю IllegalArgumentException для MONTH в приведенном ниже тестовом примере?

public class Testing {
    public static void main(String args[]) {

      Calendar c = Calendar.getInstance(Locale.getDefault());
      c.setLenient(false);
      Date d = new Date();

      c.set(Calendar.MONTH, Calendar.FEBRUARY);
      c.set(Calendar.DAY_OF_MONTH, 30);
      c.set(Calendar.YEAR, 2010);

      d = c.getTime();  //Exception is not thrown until this line

      System.out.println(d.toString());
    }
}

Я посмотрел на GregorianCalendar, который по умолчанию установлен в моей системе, и понял,что поле MONTH на самом деле будет первым, которое будет отличаться в двух 30 февраля, по сравнению с 2 марта в этом случае, но не должно ли это IllegalArgumentException быть причиной переполнения, или это было просто трудно"обнаружить"?

1 Ответ

8 голосов
/ 30 ноября 2010

Потому что в феврале всегда меньше 30 дней. И вы устанавливаете день для экземпляра Calendar равным 30. Итак, когда вы пытаетесь создать недопустимый Date, Java не позволит вам этого сделать, потому что это будет недопустимая дата, и вы выбрали setLienient(false).

Попробуйте следующее:

c.set(Calendar.DAY_OF_MONTH, 28);
c.set(Calendar.MONTH, Calendar.FEBRUARY);
c.set(Calendar.YEAR, 2010);

Это должно сработать.

Это в конечном итоге вызвано тем, что вы звоните c.setLenient(false);. Это заставляет Java быть строгим в отношении дат, которые она допускает.

См. Javadoc для метода:

public void setLenient(boolean lenient)

...