Calendar.roll 使用 Calendar.DATE 时出现奇怪的结果

Calendar.roll weird result when using Calendar.DATE

今天,在欧洲,日期是 2015 年 10 月 1 日。你能告诉我为什么 运行 此代码显示日期为 2015 年 10 月 31 日吗?

Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DATE, false);
System.out.println(yesterday.getTime());

Calendar.DATE 表示月中的第几天,而不是一年中的第几天。因此,当月中的某一天向后滚动 1 个单位时,我们实际上是从该月的第一天到最后一天。

引用 roll Javadoc(强调我的):

Adds or subtracts (up/down) a single unit of time on the given time field without changing larger fields.

并引用 Calendar Javadoc:

A larger field represents a larger unit of time.

因此,在滚动日期时,此方法不会更改 MONTH 或 YEAR 等字段。

您应该改用 Calendar.DAY_OF_YEAR

Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DAY_OF_YEAR, false);
System.out.println(yesterday.getTime());