出于好奇,为什么我在下面的测试用例中收到 MONTH
的 IllegalArgumentException
?
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
字段实际上是第一个在 2 月 30 日和本例中的 3 月 2 日不同的字段,但是这个 IllegalArgumentException
不应该是导致溢出的原因,还是它只是被认为难以“发现”?
最佳答案
因为 2 月总是少于 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:
关于Java日期奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317993/