Java中Calendar.set()直接修改当前实例字段,需注意MONTH从0开始;推荐用三参数set(year,month,date)或Java 8+的LocalDate替代,更安全直观。

Java中用Calendar.set()修改指定年月日,关键在于理解它的参数含义和调用方式——它不会创建新对象,而是直接修改当前Calendar实例的内部字段。
set() 方法的基本用法
Calendar.set(int field, int value)用于设置单个时间字段(如年、月、日),其中field是Calendar定义的常量(如YEAR、MONTH、DATE),value是对应字段的值。
-
Calendar.YEAR:年份,直接填数字,如2025 -
Calendar.MONTH:月份,注意从0开始(0=1月,11=12月) -
Calendar.DATE(或Calendar.DAY_OF_MONTH):日期,填1~31之间的整数
一次设置多个字段的推荐写法
如果要同时修改年、月、日,建议用set(int year, int month, int date)三参数重载方法,更简洁且避免多次调用引发的中间状态问题:
Calendar cal = Calendar.getInstance(); cal.set(2025, Calendar.MARCH, 15); // 设置为2025年3月15日 // 注意:Calendar.MARCH 是常量,值为2(0起始)
常见易错点提醒
使用set()时容易忽略的细节:
立即学习“Java免费学习笔记(深入)”;
- 月份必须用
Calendar.JANUARY等常量,或手动减1;写cal.set(Calendar.MONTH, 3)其实是设为4月 - 设置后,小时、分钟、秒等字段保持原值,不会自动归零;如需清空时间部分,应额外调用
cal.set(Calendar.HOUR_OF_DAY, 0)等 -
set()不触发立即计算,但后续调用getTime()或get()时会自动完成内部校验(比如自动处理2月29日是否合法)
替代方案:推荐用现代API(Java 8+)
虽然Calendar仍可用,但LocalDate更直观安全:
LocalDate date = LocalDate.of(2025, 3, 15); // 年、月、日直接传入,月从1开始 // 或基于现有日期修改: LocalDate today = LocalDate.now(); LocalDate newDate = today.withYear(2025).withMonth(3).withDayOfMonth(15);
没有可变状态,线程安全,语义清晰,日常开发优先选它。


















