Java Calendar.add 给出错误的年份

use*_*183 6 java calendar

我的程序获取当前日期,然后在循环中向该日期添加一周并打印出新日期。就像是:

Calendar cal = Calendar.getInstance();
for (int i=0; i < 52; i++) {
cal.add(Calendar.DATE, 7);
// print date out
}
Run Code Online (Sandbox Code Playgroud)

add 方法按照我预期的方式工作,直到它到达 12 月 30 日,此时年份从 2012 年跃升至 2013 年。

因此,使用今天 2012 年 4 月 16 日的日期,我测试了一些不同的输入:

this - cal.add(Calendar.DATE, 38*7);
yields- "date:1/7/2013"
this - cal.add(Calendar.DATE, 37*7);
yields- "date:12/31/2013"
this - cal.add(Calendar.DATE, 37*7-1);
yields- "date:12/30/2013"
this - cal.add(Calendar.DATE, 37*7-2);
yields- "date:12/29/2012"
Run Code Online (Sandbox Code Playgroud)

所以我注意到这一年在 12 月 30 日和 12 月 31 日之前都是正确的,然后当它回到 1 月时又会自我更正。有没有理由这样做?这与 2012 年是闰年有什么关系,还是我误解了 add 方法

小智 6

你是SimpleDateFormat用来打印日期并YYYY用来生成年份的吗?如果是这样,这就是问题所在。因为YYYY产生的是周年而不是日历年。由于 30/12/2012 是 2013 年的日历第 1 周,因此YYYY生成 2013。要获取日历年,请yyyySimpleDateFormat格式字符串中使用。

https://bugs.openjdk.java.net/browse/JDK-8194625


anu*_*ava 0

它应该是:

cal.add(Calendar.DAY_OF_YEAR, 7);
Run Code Online (Sandbox Code Playgroud)

Calendar.DATE与 相同Calendar.DAY_OF_MONTH