Calendar.getActualMaximum(Calendar.DAY_OF_MONTH)是获取指定年月实际最大天数的正确方法,需先用set(year, month)设置年份和从0开始的月份,否则结果不可靠;推荐使用Java 8+的LocalDate.of(year, month, 1).lengthOfMonth()替代。

Calendar.getActualMaximum(Calendar.DAY_OF_MONTH) 是获取当前 Calendar 对象所表示月份实际最大天数的正确方法。
必须先设置好年份和月份
Calendar 不会自动关联“当前日期”,它只记录你设定的时间点。如果未明确 set 年份和月份,调用 getActualMaximum 可能返回错误结果(比如基于默认的基准时间,通常是 1970 年 1 月)。
正确做法是:先用 set(year, month) 指定目标年月(注意:month 从 0 开始,即 0 表示 1 月,11 表示 12 月):
- Calendar cal = Calendar.getInstance();
- cal.set(2024, Calendar.FEBRUARY); // 或 cal.set(2024, 1);
- int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 返回 29(2024 是闰年)
推荐用 LocalDate 替代(Java 8+)
Calendar 类设计复杂、线程不安全,且 month 索引易错。现代写法更简洁可靠:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- LocalDate date = LocalDate.of(2024, 2, 1); // 2024 年 2 月任意一天
- int maxDay = date.lengthOfMonth(); // 直接返回 29
- 或用 TemporalAdjusters:date.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth()
常见误区提醒
别混淆 getMaximum 和 getActualMaximum:
- getMaximum(Calendar.DAY_OF_MONTH) 总是返回 31(该字段理论最大值),与具体月份无关;
- getActualMaximum(Calendar.DAY_OF_MONTH) 才根据实际年月计算,如 2023 年 2 月返回 28,2024 年 2 月返回 29;
- 确保 Calendar 的时区、年、月已正确设置,否则结果不可靠。
简单封装工具方法
如果仍需使用 Calendar,可封装成易用方法:
- public static int daysInMonth(int year, int month) { // month: 1~12
- Calendar cal = Calendar.getInstance();
- cal.set(year, month - 1, 1); // 转为 0-based
- return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
- }
调用 daysInMonth(2024, 2) → 返回 29。

















