Java Date奇怪

Sco*_*ott 2 java datetime

出于好奇,为什么我收到IllegalArgumentExceptionMONTH在下面的测试案例?

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

我查看了GregorianCalendar,它是我系统的默认值,并且意识到该MONTH字段实际上是第一个在2月30日与3月2日相比有所不同的字段,但这不IllegalArgumentException应该是导致溢出的原因,还是仅仅被认为难以"发现"?

jjn*_*guy 8

因为二月总是不到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);
Run Code Online (Sandbox Code Playgroud)

这应该工作.

这最终是因为你打电话造成的c.setLenient(false);.这会导致Java对其允许的日期严格控制.

有关方法,请参阅Javadoc:

public void setLenient(boolean lenient)