2012-11-10 75 views
1

我需要經過一年的幾個月,看看這個月的最後一天是28,29,30或31。我的問題是,第一,如果語句總是判斷爲真:爲什麼我的if語句總是評估爲true?

MOIS_I = 31 
if (mois == "Janvier" || "Mars" || "Mai" || "Juillet" || "Août" || "Octobre" || "Décembre" || "1" || "3" || "5" || "7" || "8" || "10" || "12" || "01" || "03" || "05" || "07" || "08") { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
} 

此外,它似乎有必要做if (mois == "Janver" || mois == "Février" || ...)等,但我想知道是否有更好的方法來做到這一點。

下面是完整的代碼:

var mois, annee, test4, test100, test400; 
    const MOIS_P = 30; 
    const MOIS_I = 31; 
    const FEV_NORM = 28; 
    const FEV_BISSEX = 29; 
    const TEST_4 = 4; 
    const TEST_100 = 100; 
    const TEST_400 = 400; 

    mois = window.prompt("Entrez un mois de l'année", ""); 
    annee = window.prompt("Entrez l'année de ce mois", ""); 
    /* MOIS IMPAIRS */ 
    if (mois == "Janvier" || "Mars" || "Mai" || "Juillet" || "Août" || "Octobre" || "Décembre" || "1" || "3" || "5" || "7" || "8" || "10" || "12" || "01" || "03" || "05" || "07" || "08") { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
    /* MOIS PAIRS */ 
    } else if (mois == "Février" || "Avril" || "Juin" || "Septembre" || "Novembre" || "2" || "4" || "6" || "9" || "11" || "02" || "04" || "06" || "09") { 
     if (mois == "Février") { 
      test4 = parseInt(annee) % TEST_4; 
      test100 = parseInt(annee) % TEST_100; 
      test400 = parseInt(annee) % TEST_400; 
      if (test4 == 0) { 
       if (test100 != 0) { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_BISSEX + " jours "); 
       } else { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_NORM + " jours "); 
       } 
      } else if (test400 == 0) { 
        window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_BISSEX + " jours "); 
      } else { 
       window.alert("Le mois " + mois + " de l'année " + annee + " compte " + FEV_NORM + " jours "); 
      } 
     } else { 
      window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_P + " jours "); 
     }   
    } else { 
     window.alert("Apocalypse!"); 
    } 

TEST_4,TEST_100,TEST_400是測試如果年份是閏年(這意味着二月有29天,而不是28)。

謝謝!

+0

什麼語言?它*很重要*。看起來它可能是JavaScript,但請注意,'const'在標準JavaScript中還沒有出現。 –

+1

請注意,非空字符串總是會計算爲** true **,所以'if(/ * any condition || * /「Any string here」)'將始終返回** true **。值** null **,** false **本身,** undefined **和一個空字符串,但是,將評估爲** false **。 – inhan

回答

0

根據if聲明,是的,您總是需要添加mois ==部分,否則您將檢查字符串「Fevrier」的布爾值,而不是將其與mois變量值進行比較。

就您試圖實現的一般結果而言,可能有很多更簡單的方法,可供您在標準庫中使用。如果這是JavaScript,請參閱this article

0

這是我會怎麼做呢:

  1. 獲取一個月,並將其轉換爲數字。你可能會想用一個哈希來做到這一點。
  2. 獲取年份並將其轉換爲數字,使用parseInt()就像您所做的那樣。
  3. 如果month % 2 == 1,那麼它的一個奇怪的一個月:
    • 如果year % 400 == 0 || year % 100 == 0 || year % 4 == 0:妥善處理閏年。
    • 否則:返回30
  4. 否則:它的一個甚至幾個月,回到31
+0

有趣。我幾天前正在閱讀閏年,並且我學到了一些我不知道的東西,所以我想分享它。一個例外是[寫在維基百科頁面中的「閏年」](http://en.wikipedia.org/wiki/Leap_year)的第二段。 – inhan

2

做這樣的(簡單的方法)

var last_day=new Date(year,month,-1).getDate() 

這會給最後一個月中的某天

+0

這是我第一次的javascript作業,這看起來是正確的,但我還沒有。 – Pobe

-1

下面是一個更好的方法來檢查一大堆字符串。你把所有允許名稱中的對象(通常稱爲地圖),然後您可以檢查該名稱是否在地圖上用一行代碼:

var names = { 
    "Janvier": true, "Mars": true, "Mai": true, "Juillet": true, 
    "Août": true, "Octobre": true, "Décembre": true, 
    "1": true, "3": true, "5": true, "7": true, "8": true, "10": true, "12": true, 
    "01": true, "03": true, "05": true, "07": true, "08": true 
}; 

if (names[mois] === true) { 
    window.alert("Le mois " + mois + " de l'année " + annee + " compte " + MOIS_I + " jours "); 
} 
0

這裏有一個縮短建議您if()條件:RegExp對象(雖然這不會回答你的問題)。

/^(Janvier|Mars|Mai|Juillet|Août|(Octo|Décem)bre|0?[13578]|1[02])$/.test(mois)) 
// append i after the last forward slash if you want it not to respect case 

if (
mois == "Janvier" || mois == "Mars" || mois == "Mai" || mois == "Juillet" || 
mois == "Août" || mois == "Octobre" || mois == "Décembre" || mois == "1" || 
mois == "3" || mois == "5" || mois == "7" || mois == "8" || mois == "10" || 
mois == "12" || mois == "01" || mois == "03" || mois == "05" || mois == "07" || 
mois == "08" 
) 

相同
if (/^(Février|Avril|Juin|(Sept|Nov)embre|0?[2469]|11)$/.test(mois)) 
// same thing about the case-insensitive (i) flag here... 

if (
mois == "Février" || mois == "Avril" || mois == "Juin" || mois == "Septembre" || 
mois == "Novembre" || mois == "2" || mois == "4" || mois == "6" || mois == "9" || 
mois == "11" || mois == "02" || mois == "04" || mois == "06" || mois == "09" 
) 
0

這似乎不靠譜日期數學的工作是相同的:

var SomeDate = new Date(2012, 10); // November, 2012 

SomeDate.setDate(SomeDate.getDate() - 1); // go back one day 

var DaysInMonth = SomeDate.getDate();