2013-11-01 35 views
0

我需要爲接受日期的程序創建一個方法,如果有效將添加從01/01/xx到當年日期的所有天數,例如10/1/1999年將顯示「1999年第274天」。我有下面的代碼,但它沒有添加正確的值。不知道我做錯了什麼。在一年中添加天 - Java

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

在每種情況下你都錯過了中斷,但是如果你不需要實現這個功能(比如家庭作業),有一個java功能可以很好地完成這項工作:http:// stackoverflow .com/questions/12525396 /今天是第n天 – luanjot

+0

您可以使用'Calendar.get(Calendar.DAY_OF_YEAR)'?這會爲你節省很多代碼。 –

+0

它是一個類項目,我需要創建我自己的方法,我嘗試過並且沒有休息時間,並且返回的值不正確 –

回答

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天。

這當然是不正確的 - 從一月份開始每隔兩個月就有31次。所以我們計算了到目前爲止我們已經有31天的月份。因爲這是一個奇數的月份(至少到8月份),有31天,我們將這個月除以2(記住 - 整數除法,我們會得到floor(month/2))來得到月份數過去了31天。

這還是不正確的,從8月開始,我們又有一天要增加 - 我們以前的計算會產生一個月,比我們實際減少了31天。因此,如果偶數月份過去了(我們可以通過將月份除以2看看剩餘物,這稱爲「模除法」並寫成「月%2」)來說明這一點。

最後,我們要去二月。如果二月份已經過去了(=我們三月或以後),我們只需要減去兩天 - 或者如果是閏年,那麼一天。我在這裏使用了所謂的「三元語句」(... ... ...:...)。基本上它的簡稱if (isLeapYear(year)) { days -= 1; } else { days -= 2; }

+0

非常感謝你使很多感覺,方法現在正常工作。 –

+0

編輯我的代碼 - 它甚至在八月份都不工作。請確保相應地更新您的代碼。現在應該工作 - 請其他人可以驗證嗎? –

+0

它以前工作,做了小的改動,它有效,但由於某種原因,它爲我的列表中的兩個日期返回了不正確的值,這就是我的,從第一個月減去1,因爲從我讀的東西中,其中一個月份是天數=天,對嗎? –

3

你需要終止每個casebreak

  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)。

+0

這個「需要休息」是可取的,因爲它允許您在需要時省略它1:做x,y和z,案例2:做y和z,案例3:做z –

+0

@RichardTingle:是的,但是這與我們正在回答的問題有什麼關係? – NPE

+0

它回答下一個邏輯問題「爲什麼java會像這樣?!」,似乎有用的信息,但不值得回答,我認爲你不同意 –