一年中添加几天 - Java

时间:2013-11-01 20:52:03

标签: java loops switch-statement

我需要为接受日期的程序创建一个方法,如果有效,则会将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;  
    }  

2 个答案:

答案 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; }

的缩写