yearmonth.lengthofmonth() 自动处理闰年,严格遵循公历规则:能被4整除但不能被100整除,或能被400整除的年份为闰年,2月返回29天,否则28天;无需手动判断,线程安全且语义清晰。

YearMonth.lengthOfMonth() 会自动处理闰年,无需手动计算。它内部基于 ISO 历法规则判断闰年,并返回对应月份的实际天数,2 月在闰年返回 29,平年返回 28。
YearMonth 已内置闰年逻辑
Java 的 YearMonth 是不可变、线程安全的日期时间类,其 lengthOfMonth() 方法直接调用底层 ChronoField.DAY_OF_MONTH.range().getMaximum(),而该逻辑已严格遵循公历闰年规则:
- 能被 4 整除但不能被 100 整除的年份是闰年(如 2004、2024)
- 能被 400 整除的年份也是闰年(如 2000)
- 其余为平年(如 1900、2100)
直接调用即可,无需额外判断
你只需创建 YearMonth 实例,调用 lengthOfMonth():
YearMonth feb2024 = YearMonth.of(2024, 2); // 闰年 System.out.println(feb2024.lengthOfMonth()); // 输出 29 YearMonth feb2023 = YearMonth.of(2023, 2); // 平年 System.out.println(feb2023.lengthOfMonth()); // 输出 28 YearMonth feb1900 = YearMonth.of(1900, 2); // 平年(整除100但不整除400) System.out.println(feb1900.lengthOfMonth()); // 输出 28
注意:不要用 LocalDate 或手动算
有人试图用 LocalDate.of(year, 2, 1).lengthOfMonth() 也能得到正确结果,但这多创建了对象,且语义不如 YearMonth 清晰。更不推荐自己写 if-else 判断闰年——既易错又重复造轮子。
扩展:配合 isLeapYear() 验证更直观
如果想显式确认是否为闰年,可搭配使用:
YearMonth ym = YearMonth.of(2024, 2); boolean isLeap = ym.getYear() % 4 == 0 && (ym.getYear() % 100 != 0 || ym.getYear() % 400 == 0); // 但更推荐直接用 Year.isLeap() 或 ym.atDay(1).isLeapYear() System.out.println(ym.atDay(1).isLeapYear()); // true System.out.println(ym.lengthOfMonth()); // 29
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











