闰年判断规则是:能被4整除且不能被100整除,或能被400整除;java中推荐用((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0),优先使用year.isleap()或localdate.isleapyear()。

闰年判断的数学规则必须先写对
Java里写错闰年逻辑,90%是因为没吃透规则本身。不是“能被4整除就是闰年”,而是:能被4整除 且 不能被100整除,或者 能被400整除。
这个“或”是关键——1900 被4整除也被100整除,但不被400整除,所以不是闰年;2000 被400整除,才是闰年。
- 别用
year % 4 == 0单独判断 - 别把
&&和||顺序搞反,优先级容易出错 - 推荐先算子表达式再组合:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
用 if-else 还是三元运算符?看可读性
单纯返回 boolean 值时,三元运算符没优势,反而增加理解成本。if-else 更直白,也方便后续加日志或调试断点。
示例中常见错误是把逻辑塞进 return 一行里,括号漏一个就语义全变:
立即学习“Java免费学习笔记(深入)”;
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; // ✅ 正确(但建议加括号)
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0; // ❌ 看似一样,实际依赖运算符优先级,易误读
- 显式加括号更安全:
((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0) - 如果要返回字符串或做分支处理,直接用
if/else,别硬套三元 - 别在条件里调用可能抛异常的方法(比如从用户输入解析
int),先校验再判断
LocalDate.isLeapYear() 是最省心的方案
Java 8+ 提供了 LocalDate.isLeapYear(),它内部已正确实现闰年逻辑,还自动处理了负数年份、历法变更等边界情况。
除非你在写算法题或教学演示,否则没必要手写判断逻辑。
- 用法很简单:
boolean leap = LocalDate.of(year, 1, 1).isLeapYear(); - 注意
LocalDate.of()会校验年份合法性,year为0或负数会抛DateTimeException - 如果只是判断年份,不用构造完整日期,可用
Year.isLeap()(更轻量):Year.of(year).isLeap() - 这两个 API 在 Android 上需 API 26+,旧版本得回退到手动逻辑
测试时最容易漏掉的三个年份
只测 2000、2004、2100 不够。这三个年份一跑就暴露逻辑漏洞:
-
1900:被4和100整除,但不被400整除 → 应返回false -
2000:被400整除 → 应返回true -
0:Java 中年份 0 是“公元前1年”,Year.of(0).isLeap()返回true,但手写逻辑常忽略该情况
手写逻辑若没考虑年份范围,Integer.MIN_VALUE 取模结果可能和预期不符(负数取模在 Java 中是向零截断),所以输入前最好加范围检查。









