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!
6 Antworten
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.
So würde ich vorgehen:
- Holen Sie sich Monat und konvertieren Sie es in eine Zahl. Sie werden wahrscheinlich einen Hash verwenden wollen, um dies zu tun.
- Holen Sie sich das Jahr und konvertieren Sie es mit
parseInt()
in eine Zahl, wie Sie es getan haben. - 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.
- Wenn
- Sonst: Es ist ein gerader Monat, Rückkehr 31.
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 ");
}
Mach das (auf einfache Weise)
var last_day=new Date(year,month,-1).getDate()
Dies wird den letzten Tag des Monats geben
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();
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"
)