先判断年是否为闰年,再根据闰年平年去计算日子,会很繁杂。计算日子的两部分是重复的。
if(闰年){
calculate days;
} else { //平年
calculate days;
}
直接从日期开始,可以看到只是把1月和2月两个不会被闰平年影响的特例提取出来了,其他的还是没有区别,还是比较麻烦。
if(month == 1){
days = day;
} else if(month == 2) {
days = day +31;
} else {//从3月开始,后面的月份都得知道是否为闰年。
if(闰年){
calculate days;
} else {
calculate days;
}
}
而如果我们只考虑平年这一种情况,先不被闰年所干扰的话。这么容易判断出是闰年后直接days++,从而忽略了只有3月份以后平闰才有区别的情况。
if(month == 1){
days = day;
} else if(month == 2) {
days = 28 + day;
} else if(month == 3) {
days = 59 + day;
} else if (month == 4) {
days = 90 + day;
} else if (month == 5) {
days = 120 + day;
} else if (month == 6) {
days = 151 + day;
} else if (month == 7) {
days = 181 + day;
} else if (month == 8) {
days = 212 + day;
} else if (month == 9) {
days = 243 + day;
} else if (month == 10) {
days = 273 + day;
} else if (month == 11) {
days = 304 + day;
} else if (month == 12) {
days = 334 + day;
}
if(((year % 400 == 0) || (year % 4 ==0 && year % 100 != 0)) && month >= 3){
days++;
}
sout(days);
这种常量直接的判断,我们可以使用switch,执行效率更高,还能简化代码。
一般地,我们会直接写:
switch(month){
case 1:
days += day;
break;
case 2:
days = day + 31;
break;
...
}
这么写却是忽略了switch语句的特点,switch语句中case可以打乱顺序,break也可以省略。一旦对应上,会一直往下走,直到遇到break或switch结束才会停止。所以我们这样写:
switch(month){
case 12:
days += 30;//加11月的天数
case 11:
days += 31;
...
case 3:
if((year % 400 == 0) || (year % 4 ==0 && year % 100 != 0)){
days += 29;
} else {
days += 28;
}
case 2:
days += 31;
case 1:
days += day;
}