Ich muss die Monate des Jahres durchgehen und herausfinden, ob der letzte Tag des Monats 28, 29, 30 oder 31 ist. Mein Problem ist, dass die erste if-Anweisung immer als wahr ausgewertet wird:

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 ");
}

Es scheint auch notwendig zu sein, if (mois == "Janver" || mois == "Février" || ... ) und so weiter zu machen, aber ich wollte wissen, ob es einen besseren Weg gibt, dies zu tun.

Hier ist der vollständige Code:

    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 sollen testen, ob das Jahr ein Schaltjahr ist (was bedeutet, dass der Februar 29 statt 28 Tage hat).

Vielen Dank!

1
Pobe 10 Nov. 2012 im 20:38

6 Antworten

Beste Antwort

In Bezug auf die Anweisung if müssen Sie immer einen Teil mois == hinzufügen, andernfalls überprüfen Sie den Booleschen Wert der Zeichenfolge "Fevrier", anstatt ihn mit dem Variablenwert mois zu vergleichen.

In Bezug auf das allgemeine Ergebnis, das Sie erzielen möchten, stehen Ihnen in der Standardbibliothek wahrscheinlich viele einfachere Möglichkeiten zur Verfügung. Wenn dies JavaScript ist, siehe z. dieser Artikel.

0
NOtherDev 10 Nov. 2012 im 16:42

So würde ich vorgehen:

  1. Holen Sie sich Monat und konvertieren Sie es in eine Zahl. Sie werden wahrscheinlich einen Hash verwenden wollen, um dies zu tun.
  2. Holen Sie sich das Jahr und konvertieren Sie es mit parseInt() in eine Zahl, wie Sie es getan haben.
  3. Wenn month % 2 == 1, dann ist es ein ungerader Monat:
    • Wenn year % 400 == 0 || year % 100 == 0 || year % 4 == 0: Schaltjahre angemessen behandeln.
    • Sonst: 30. zurückgeben.
  4. Sonst: Es ist ein gerader Monat, Rückkehr 31.
0
user2398029 10 Nov. 2012 im 16:50

Hier ist ein besserer Weg, um gegen eine ganze Reihe von Zeichenfolgen zu prüfen. Sie fügen alle zulässigen Namen in ein Objekt ein (häufig als Karte bezeichnet) und können dann mit einer Codezeile überprüfen, ob sich der Name in der Karte befindet:

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 ");
}
-1
jfriend00 10 Nov. 2012 im 17:15

Mach das (auf einfache Weise)

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

Dies wird den letzten Tag des Monats geben

2
neu-rah 10 Nov. 2012 im 16:57

Dies scheint ohne knifflige Datumsberechnung zu funktionieren:

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

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

var DaysInMonth = SomeDate.getDate();
0
Steve Wellens 10 Nov. 2012 im 17:47

Hier ist ein Verkürzungsvorschlag für Ihre if() Bedingungen: das RegExp-Objekt (obwohl dies Ihre Frage nicht beantwortet).

/^(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

Ist das gleiche mit

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

Und

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

Ist das gleiche mit

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
inhan 10 Nov. 2012 im 17:24