推荐使用yearmonth类获取指定月份总天数:构造yearmonth实例后调用lengthofmonth(),自动处理闰年与大小月;也可从localdate用yearmonth.from()推导;避免使用线程不安全且易错的calendar方式。

Java 中获取指定月份的总天数,推荐使用 java.time 包中的 YearMonth 类,它简洁、线程安全且能自动处理闰年和大小月。
用 YearMonth 获取指定年月的天数
这是最直接的方式:构造一个 YearMonth 实例,调用 lengthOfMonth() 方法即可。
- 支持任意年份(包括闰年)和任意月份(1–12)
- 自动识别二月在闰年有 29 天、平年 28 天
- 无需手动判断大小月或写 if-else
示例代码:
import java.time.YearMonth; int year = 2024; int month = 2; // 2 月 int days = YearMonth.of(year, month).lengthOfMonth(); System.out.println(days); // 输出:29(2024 是闰年)
从 LocalDate 或 LocalDateTime 推导当月天数
如果你已有某个日期对象,想快速知道它所在月份的总天数,可先提取年月再计算:
- 用
localDate.withDayOfMonth(1)截断到当月第一天,再转为YearMonth - 或更简洁地:用
YearMonth.from(localDate)
示例:
LocalDate date = LocalDate.of(2023, 11, 15); int days = YearMonth.from(date).lengthOfMonth(); System.out.println(days); // 输出:30(11 月)
兼容旧代码:Calendar 方式(不推荐)
如果项目仍用 Calendar,可通过设置年月后调用 getActualMaximum(Calendar.DAY_OF_MONTH) 获取,但需注意:
- 月份从 0 开始(0 表示 1 月),容易出错
- Calendar 不是线程安全的,每次需 new 实例
- 逻辑冗长,且需手动 set 年、月
示例(仅作对比):
Calendar cal = Calendar.getInstance(); cal.set(2024, Calendar.FEBRUARY, 1); // 注意:月份从 0 起,FEBRUARY=1 int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // 返回 29
注意事项
避免常见错误:
- 别传入非法月份(如 13 或 -1),
YearMonth.of()会抛DateTimeException - 若需校验输入,建议提前用
Month.of(int)判断月份有效性 - 不要用
LocalDate.lengthOfMonth()—— 这个方法不存在,LocalDate没有该 API
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











