java - 在java.util.Calendar中,为什么设置Calendar.YEAR的值会影响Calendar.MONTH的值?

标签 java

我只是尝试 java.util.Calendar 方法 getActualMaximum() 来看看是否可以获得给定年份的一个月中的最大天数。这是我的代码:

public static void main(String[] args) {
    Calendar c = Calendar.getInstance(); // today is July 29, 2012
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
    c.set(Calendar.MONTH, Calendar.FEBRUARY); // set to February 2012
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
    c.set(Calendar.YEAR, 2011); // set year to 2011, now February 2011
    System.out.println(c.get(Calendar.MONTH) + " " + c.getActualMaximum(Calendar.DATE) + " " + c.get(Calendar.YEAR));
}

我期望的输出是:

6 31 2012 // last day of July 2012 is 31
1 29 2012 // last day of Feb 2012 is 29
1 28 2011 // last day of Feb 2011 is 28

但是,这就是我得到的:

6 31 2012
1 29 2012
2 31 2011 // HUH?

(在 java.util.Calendar 中,一月到十二月的月份值从 0 到 11 开始,而月份的天数本身从 1 开始。)

为什么月份突然设置为 Calendar.MARCH?这是怎么回事,我该怎么做才能正确获取给定月份和年份的最后几天?我正在探索该方法,因为我不想设置自己的 boolean 值数组,其中对于代表 31 天的月份的索引为 true,对于不代表 31 天的月份为 false。

最佳答案

我相信日历会记住您今年有多少天。在 2012 年,您是第 31 + 29 = 2 月 29 日。在 2011 年,您是 3 月 1 日。然后您要求该月的实际最大值,(对于 3 月)是 31。

日历 API 很糟糕。

您应该直接设置年份和月份,然后再询问用例中的实际最大值。

关于java - 在java.util.Calendar中,为什么设置Calendar.YEAR的值会影响Calendar.MONTH的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11706398/

相关文章:

java - MVVM 在远程类中共享首选项

java - 在 POM 的 WEB-INF\lib 中添加一个 jar

java - 如何使 Activity 不全屏

java - Gson JsonObject 复制值影响其他 JsonObject 实例

Java Swing - JTextPane 中插入组件的问题

java - 如何在 ArrayList 中找到最小值以及索引号? ( java )

java - 当我使用 && 运算符比较两组表达式时,是否必须放入内括号?

Java 1.4 + 可扩展构建器模式

java - 在 Java 中使用 Aspose 单元动态创建工作表?

java - JPA存储库读取、删除和保存具有旧ID的对象