日历滚动操作不能为我提供正确的输出

use*_*108 5 java calendar

我们正在使用日历.滚动以向上或向下移动日期.javadoc提到更大的字段没有被修改(即如果我们将日期从月的第一天开始向左移动5,不幸的是,calendar.getTime()不会得到上个月的值) .月份值保持不变,如何更改此行为.我真的想要适当地移动日期值.(例如,如果我在2010年8月1日向左移动了5天 - 我希望看到2010年6月27日而不是2010年8月27日).我在这里错过了什么?

K E*_*son 10

您可以使用Calendar.add否定amount.


YoK*_*YoK 7

由于滚动规则检查,您将需要使用add(Calendar.DATE, -5)方法Calendar.

roll 方法描述为:

添加到field已签名的金额而不更改更大的字段.负滚动量意味着在不改变较大字段的情况下从字段中减去.

示例:考虑GregorianCalendar 最初设置为1999年8月31日.调用roll(Calendar.MONTH, 8)将日历设置为1999年4月30日.使用GregorianCalendar,DAY_OF_MONTH 字段在4月份不能为31. DAY_OF_MONTH设置为最接近的可能值30.该YEAR字段保持1999的值,因为它是一个更大的字段MONTH.

例如:考虑GregorianCalendar 原来设置为周日6月6日,1999年呼叫roll(Calendar.WEEK_OF_MONTH, -1)设置日历日1999年6月1日,而调用 add(Calendar.WEEK_OF_MONTH, -1)设置日历日1999年5月30日,这是因为卷规则强加了额外的约束:将MONTH 不得WEEK_OF_MONTH 滚动时改变.与添加规则1一起,结果日期必须在6月1日星期二至6月5日星期六之间.根据添加规则2, DAY_OF_WEEK更改时的不变量WEEK_OF_MONTH设置为星期二,与星期日最接近的可能值(星期日是一周的第一天).