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

use*_*955 1 java datetime calendar

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

Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DATE, false);
System.out.println(yesterday.getTime());
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 6

Calendar.DATE代表一个月中的某一天,而不是一年中的某一天.因此,当将一个月的日期向后滚动1个单位时,我们基本上是从该月的第1天到最后一天.

引用rollJavadoc(强调我的):

在给定时间字段上添加或减去(向上/向下)单个时间单位而不更改更大的字段.

并引用CalendarJavadoc:

较大的字段表示较大的时间单位.

因此,滚动月中的某天时,此方法不会更改MONTH或YEAR等字段.

您应该使用Calendar.DAY_OF_YEAR:

Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DAY_OF_YEAR, false);
System.out.println(yesterday.getTime());
Run Code Online (Sandbox Code Playgroud)