用于检查闰年的Java约定

时间:2017-10-30 02:18:00

标签: java conventions

根据我的教科书中的代码,以及我在网上找到相同内容的代码,检查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整除。因此,如果(年%4 == 0)不成立,无论你如何削减它,那么你的年份不是闰年,而且声明是错误的。那里的额外代码似乎是多余的。为什么我的教科书告诉我这样写?是否有某种Java约定我不知道?

3 个答案:

答案 0 :(得分:3)

  

我的问题是。为什么你不能这样写呢?

if (month == 2 && day == 29 && !(year % 4 == 0)) {
   // don't do stuff because it's not leap year
}

嗯......你可以,但它不能给出1900年,2100年等的正确答案,等等 1 。更复杂的版本是正确的。

基本上,在公历中决定某一年何时是闰年的规则比在小学中学到的要复杂得多。如果您想了解更多详情:

另请注意,公历不完美,如here所述。然而,在传统实践中根深蒂固的是calendrical reform proposals用于修复"感知到的问题没有多大机会。 (至少,不是人类是地球的:-))

  

我只想弄清楚为什么文本提供的if语句的条件比实际需要的条件更多......

因为,实际需要条件。见上文!

从Java软件工程的角度来看,更好的想法是使用Java 8 java.time API来测试闰年,而不是自己编写代码(并且可能会出错!)。

1 - 您可能会说:"我的代码不需要在2100年工作,因为我将在此之前死去"。有一个简单的两个字反驳。 " Millenium bug"。

答案 1 :(得分:1)

你问题中的第一段代码是正确的,如(根据维基百科):

  

在阳历中,每个闰年有366天而不是通常的365天,将2月延长至29天而不是共同的28天。这些额外的天数以年为四的倍数(除了可分割的年数) 100而不是400)。

虽然我使用Java 8的java.time包来检查闰年的方式是这样的:

boolean isLeapYear = Year.now().isLeap();

如果你想检查它是否在2月29日,你可以使用

boolean is29Feb = MonthDay.now().getDayOfMonth() == 29 && YearMonth.now().getMonth() == Month.FEBRUARY;

答案 2 :(得分:0)

我更喜欢如果您可以使用该库,它会删除错误检查。

public static boolean isLeapYear(int year) {
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.YEAR, year);
  return cal.getActualMaximum(Calendar.DAY_OF_YEAR) > 365;
}

这是非常标准的代码,你可以随处获得。