0

我有以下代码

    Calendar calendar = Calendar.getInstance();

    calendar.set(2011, 7, 29);      //case 1    
   // calendar.set(2011, 7, 30);      //case 2
   // calendar.set(2011, 7, 31);    //case 3

    System.out.println("===After seting the date== "+calendar.getTime());

    System.out.println("=================================================================");

    calendar.add(Calendar.MONTH, 6);


    System.out.println("===result after adding 6 months==  "+calendar.getTime());

对于案例 2 和案例 3,我也得到了相同的结果。它应该溢出到下个月并显示新日期。但它没有发生。

4

2 回答 2

4

目前尚不清楚您是在使用“应该”来表示“这就是我想要它做的事情”还是表示“这是我相信它被记录在案的事情”。该文档实际上支持给定的行为:

add(f, delta) 将 delta 添加到字段 f。这相当于调用 set(f, get(f) + delta) 并进行两次调整:

添加规则 1。调用之后的字段 f 的值减去调用之前的字段 f 的值是 delta,以字段 f 中发生的任何溢出为模。当字段值超出其范围时会发生溢出,因此,下一个较大的字段会递增或递减,并且字段值会调整回其范围内。

添加规则 2。如果期望较小的字段是不变的,但由于字段 f 改变后其最小值或最大值的变化或其他约束,例如时区偏移量变化,它不可能等于它的先前值,那么它的值调整为尽可能接近其预期值。较小的字段表示较小的时间单位。HOUR 是比 DAY_OF_MONTH 小的字段。不对预期不会保持不变的较小字段进行任何调整。日历系统确定哪些字段预计是不变的。

此外,与 set() 不同,add() 强制立即重新计算日历的毫秒数和所有字段。

示例:考虑一个 GregorianCalendar 最初设置为 1999 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2000 年 9 月 30 日。添加规则 1 将 MONTH 字段设置为九月,因为在八月添加 13 个月会给出九月下一年。由于 DAY_OF_MONTH 在 GregorianCalendar 中不能为 9 月的 31,因此添加规则 2 将 DAY_OF_MONTH 设置为 30,这是最接近的可能值。虽然它是一个较小的字段,但 DAY_OF_WEEK 不会被规则 2 调整,因为它预计会随着 GregorianCalendar 中月份的变化而变化。

示例的第二部分正是您面临的情况: DAY_OF_MONTH 预计是不变的,但必须更改才能保持在正确的月份内,因此将其调整为最接近的可能值(在您的情况下为 29) .

所以看起来这种行为对我来说一致的——你认为它以什么方式不一致?

于 2012-05-04T12:20:56.980 回答
0

我发现以下是使用公历实现的最简单方法。将月份的日期设置为下个月的最后一天,以防止它成为下个月的第一天。

尝试跟随。

cal.set(Calendar.DAY_OF_MONTH, Math.min(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)));

于 2012-06-01T06:15:42.477 回答