calendar.roll方法仅在指定字段内循环增减,不进位、不借位,不影响其他时间字段;如对3月31日roll日字段+1得3月1日,对12月15日roll月字段+1得1月15日。

Calendar.roll 方法的作用就是只在当前字段“滚动”,不进位、不借位,不影响更高或更低的时间字段。
roll 的核心行为:仅限本字段,不改变其他字段
比如对“日”字段调用 roll,它只在当月的天数范围内加减(1–28/29/30/31),不会跨月;对“月”字段 roll,只在 0–11(或 1–12)之间循环,不会跨年。
- 如果当前是 2024-03-31,对“日” roll(+1),结果是 2024-03-01(不是 2024-04-01)
- 如果当前是 2024-12-15,对“月” roll(+1),结果是 2024-01-15(不是 2025-01-15)
- 如果当前是 2024-01-10,对“年” roll(+1),结果是 2025-01-10(年字段本身无上下限限制,但 roll 不影响月、日)
常用字段常量与对应范围
使用时需传入 Calendar 定义的字段常量,例如:
- Calendar.DATE:日(1–最大天数,如 31)
- Calendar.MONTH:月(0–11,注意是 0 起始)
- Calendar.DAY_OF_WEEK:星期几(1=Sunday, 2=Monday…7=Saturday)
- Calendar.HOUR_OF_DAY:24 小时制小时(0–23)
- Calendar.MINUTE:分钟(0–59)
和 add 的关键区别
这是最容易混淆的点:
- roll(int field, int amount):仅本字段循环,不触发进位/借位
- add(int field, int amount):会进位(如 31 日 +1 天 → 下月 1 日),影响更高字段
所以,要“只改本字段、不扰动其他”,必须用 roll,不能用 add。
简单示例:只让星期几滚动
想把日期从周一变成周四(+3 天),但保持年月日不变(即只改 DAY_OF_WEEK 字段):
Calendar cal = Calendar.getInstance(); cal.set(2024, Calendar.MARCH, 18); // 假设这天是周一 cal.roll(Calendar.DAY_OF_WEEK, 3); // 滚动 3 天 → 周四 // 结果仍是 2024-03-18,只是内部 WEEK_OF_YEAR/WEEK_OF_MONTH 等可能变化,但年月日没变
注意:DAY_OF_WEEK 是“星期几”的逻辑值,roll 它只改变该字段数值(1→7 循环),不影响实际日期(DATE 字段)。若想移动真实日期,应 roll DATE 或用 add。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











