【发布时间】:2018-04-09 08:45:03
【问题描述】:
根据我教科书中的代码,以及我在网上找到的相同代码,在 Java 中检查闰年看起来像这样:
if (month == 2 && day == 29 && !(year % 400 == 0 ||
(year % 4 == 0 && year % 100 != 0))) {
// don't do stuff because it's not leap year
}
我的问题是:你为什么不能这样写?
if (month == 2 && day == 29 && !(year % 4 == 0)) {
// don't do stuff because it's not leap year
}
闰年可以被 4 整除。因此,如果 (year % 4 == 0) 不正确,那么无论您如何削减它,那么您的年份不是闰年并且该陈述是错误的。那里的额外代码似乎是多余的。为什么我的教科书要我这样写?是否有某种我不知道的 Java 约定?
【问题讨论】:
-
Leap year is divisible by 4这不是真的,en.wikipedia.org/wiki/Leap_year -
这些额外的天数以 4 的倍数为单位出现(除了可以被 100 整除但不能被 400 整除的年份)
-
这不是您不知道的“与 Java 的某种约定”,而是与 公历 的约定。世纪年(可被 100 整除)即使能被 4 整除,也不是闰年,除非它们能被 400 整除。因此,1796 年和 1804 年:闰年,1800 年不能; 1896 和 1904:闰年,1900 不是; 1996、2000、2004:所有闰年; 2096 和 2104:闰年,2100 不是。
-
使用 Java 8 Year 类。
Year.isLeap(2000)返回true。Year.isLeap(1999)返回false。Year.isLeap(2100)返回false因为公历规则说它应该这样做。 -
对于那些不赞成 Q 和 A 的傻瓜,这是一个有效的问题。大多数人被教导闰年是任何能被 4 整除的年份。知道这件事的人都知道这是不真实的。但我敢打赌,你 10 岁或 60 岁的父亲不会。大多数人甚至不知道“格里高利”是什么意思。
标签: java conventions