我需要为接受日期的程序创建一个方法,如果有效,则会将01/01 / xx的所有日期添加到该年的日期,例如10/1/1999将显示" 1999年第274天"。我在下面有以下代码,但它没有添加正确的值。不确定我做错了什么。
public static int dayNumber(int day, int month, int year){
int daysInMonth = 0;
int days = 0;
boolean leapYear = isLeapYear(year);
for(int i = 1; i <= month; i++){
switch(month){
case 1: daysInMonth += 31;
case 2: if(leapYear)
daysInMonth += 29;
else
daysInMonth += 28;
case 3: daysInMonth += 31;
case 4: daysInMonth += 30;
case 5: daysInMonth += 31;
case 6: daysInMonth += 30;
case 7: daysInMonth += 31;
case 8: daysInMonth += 31;
case 9: daysInMonth += 30;
case 10: daysInMonth += 31;
case 11: daysInMonth += 30;
case 12: daysInMonth += 31;
break;
default:
break;
}
while(month <= 12){
days += daysInMonth + day;
month++;
}
}
return days;
}
答案 0 :(得分:3)
您需要使用case
终止每个break
:
case 1: daysInMonth += 31;
break;
case 2: if(leapYear)
daysInMonth += 29;
else
daysInMonth += 28;
break;
case 3: daysInMonth += 31;
break;
等等。
没有这个,statements in a switch
fall through。
此外,您的循环变量为i
并且您打开month
(但随后在另一个嵌套循环中修改month
。)
答案 1 :(得分:0)
这里真的没有必要循环......这应该可以解决问题:
days = day
days += (month-1)*30;
days += (month)/2; // every odd month until July has 31 days
days += (month >= 8 && month % 2 == 1) ? 1 : 0; // so if we have august or later and in an even month, add 1 day
if (month > 2) {
days -= (isLeapYear(year)) ? 1 : 2;
}
请阅读你对学校这项练习的评论,所以我会更好地解释一下我的代码。
首先,我们假设每个月只有30天。
这当然是不正确的 - 从1月份开始每隔一个月就有31个。所以我们计算到目前为止我们用了31天这个月的月数。由于这是奇数月(至少到8月份)有31天,我们将月份除以2(记住 - 整数除法,我们得到下限(月/ 2))以得到月份的数量过去了31天。
这仍然是不正确的,从八月开始,我们还有另一天需要补充 - 我们之前的计算结果是一个月,比实际减少了31天。因此,如果偶数个月已过去,我们只需添加一天(我们可以通过将月份除以2并查看剩余物来判断,这称为“模数除法”并写为“月份%2”)。
最后,我们要去二月。如果2月过去了(=我们在3月或之后)我们只减去两天 - 如果它是闰年则减去一天。我在这里使用了一个所谓的“三元语句”(......?...:......)。基本上它是if (isLeapYear(year)) { days -= 1; } else { days -= 2; }