哪个闰年公式是最好的选择?

时间:2015-01-25 06:26:57

标签: java

我正在使用一个代码来确定一年是否是闰年。 这是我的功能

private boolean leapYear(int year)
{
    boolean t = false;
    if((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0))
         t = true;
    return t;
}

该功能运行正常,但我很慌,它可能有一些错误,这就是为什么我有另外一个选择:

private boolean esBisiesto(int year)
{
    boolean t = false;
    if((year % 4 == 0)&&(year % 100!=0 ||(year % 100 == 0 && year % 400 == 0)))
       t = true;
    return t;
} 

但我不知道哪一个是最好的选择

4 个答案:

答案 0 :(得分:2)

版本1是正确的。实际上不需要这么多括号:

boolean leapYear = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

可以正常使用

答案 1 :(得分:1)

如果您不想重新发明轮子,java.util.GregorianCalendar已经有了实用方法:isLeapYear(year)

for (int year = 1997; year <= 2015; year++) {
    System.out.println(String.format("%d %b", year, new GregorianCalendar().isLeapYear(year)));
}

答案 2 :(得分:1)

答案 3 :(得分:1)

There are no apparent data bugs;两种方法都将返回正确年份的正确值。如果您一直担心代码中存在错误,测试它!这是获得您希望确定的方法反馈的最快方法,如果您继续测试,你也可以确保你不会意外地破坏这种方法。

现在的诀窍是确保表达式正确。对于第二种方法,真正的问题是它已被过度表达。它可以是一个较短的陈述。

让我们从内到外开始。另外,请注意我只是简化了return语句,这样我们就不会进行不必要的变量赋值。

boolean esBisiesto(int year) {
    return year % 4 == 0 && (year % 100 != 0 || (year % 100 == 0 && year % 400 == 0));
}

表达式(year % 100 != 0 || (year % 100 == 0 && year % 400 == 0))可以重写为year % 100 != 0 || year % 400 == 0,因为在第二个or分支中,隐含year % 100 == 0(或者我们会将其与第一分支)。