Java日期奇怪

标签 java datetime

出于好奇,为什么我在下面的测试用例中收到 MONTHIllegalArgumentException

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:

public void setLenient(boolean lenient)

关于Java日期奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317993/

相关文章:

java - Hazelcast 中的分区警告消息

java - jsp中显示有限行数

c# - 将 Sql Server uniqueidentifier/updated date 列与 Linq to Sql 结合使用 - 最佳方法

python - 使用Python3显示年龄(以秒为单位)

python - 如何从 python 中的日期时间字符串获取时区?

java - o.a.tomcat.jdbc.pool.ConnectionPool : Unable to create initial connections of pool. Spring Boot + MySql

java - Derby 数据库如何工作?

java - 点击自定义时如何关闭JCombobox的下拉列表?

Python:从字符串中提取日期并将其放入列表中

Java 8 日期时间格式化程序行为不端