In der Sprache der Computer, new Date()
y regular expression
Lösungen sind langsam! Wenn Sie einen super-schnellen (und super-kryptischen) Einzeiler wollen, versuchen Sie es mit diesem (unter der Voraussetzung, dass m
est en Jan=1
Format). Ich probiere immer wieder verschiedene Codeänderungen aus, um die beste Leistung zu erzielen.
Mein derzeitiges schnellste Version:
Nach einem Blick auf diese verwandte Frage Schaltjahresprüfung mit bitweisen Operatoren (erstaunliche Geschwindigkeit) und herauszufinden, was die magischen Zahlen 25 und 15 bedeuten, habe ich diese optimierte Mischung von Antworten gefunden:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Angesichts der Bitverschiebung setzt dies natürlich voraus, dass Ihre m
& y
Parameter sind beide Ganzzahlen, da die Übergabe von Zahlen als Strings zu seltsamen Ergebnissen führen würde.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
JSPerf-Ergebnisse: http://jsperf.com/days-in-month-head-to-head/5
Aus irgendeinem Grund, (m+(m>>3)&1)
ist effizienter als (5546>>m&1)
auf fast allen Browsern.
Die einzige wirkliche Konkurrenz in Sachen Geschwindigkeit kommt von @GitaarLab, daher habe ich ein Kopf-an-Kopf-Rennen mit JSPerf für uns zum Testen erstellt: http://jsperf.com/days-in-month-head-to-head/5
Es funktioniert auf der Grundlage meiner Schaltjahr-Antwort hier: javascript um Schaltjahr zu finden diese Antwort hier Schaltjahresprüfung mit bitweisen Operatoren (erstaunliche Geschwindigkeit) sowie die folgende binäre Logik.
Eine kurze Lektion in binären Monaten:
Wenn Sie den Index der gewünschten Monate interpretieren (Jan = 1) im Binärformat werden Sie feststellen, dass bei Monaten mit 31 Tagen entweder Bit 3 gelöscht und Bit 0 gesetzt ist, oder Bit 3 gesetzt und Bit 0 gelöscht ist.
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
Das heißt, Sie können den Wert um 3 Stellen verschieben mit >> 3
XOR der Bits mit dem Original ^ m
und sehen Sie, ob das Ergebnis lautet 1
ou 0
in Bitposition 0 mit & 1
. Anmerkung: Es stellt sich heraus +
ist etwas schneller als XOR ( ^
) y (m >> 3) + m
ergibt das gleiche Ergebnis in Bit 0.
JSPerf-Ergebnisse : http://jsperf.com/days-in-month-perf-test/6