407 Stimmen

Berechnung des letzten Tages des Monats

Wenn Sie 0 als die dayValue en Date.setFullYear erhalten Sie den letzten Tag des Vormonats:

d = new Date(); d.setFullYear(2008, 11, 0); //  Sun Nov 30 2008

Ein Hinweis auf dieses Verhalten findet sich unter mozilla . Ist dies eine zuverlässige browserübergreifende Funktion oder sollte ich mir alternative Methoden ansehen?

626voto

Grant Wagner Punkte 24137
var month = 0; // January
var d = new Date(2008, month + 1, 0);
console.log(d.toString()); // last day in January

IE 6:                     Thu Jan 31 00:00:00 CST 2008
IE 7:                     Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2:             Thu Jan 31 00:00:00 CST 2008
Opera 8.54:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60:               Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17:         Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3:            Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)

Die Leistungsunterschiede sind auf Unterschiede in der toString() Umsetzung, nicht weil die Daten unterschiedlich sind.

Natürlich bedeutet die Tatsache, dass die oben genannten Browser 0 als letzten Tag des Vormonats verwenden, nicht, dass sie dies auch weiterhin tun werden, oder dass die nicht aufgeführten Browser dies auch tun werden, aber es verleiht der Annahme Glaubwürdigkeit, dass es in jedem Browser gleich funktionieren sollte.

149voto

orad Punkte 13913

Ich finde, das ist für mich die beste Lösung. Lassen Sie das Date-Objekt die Berechnung für Sie übernehmen.

var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);

Wenn der Parameter day auf 0 gesetzt wird, bedeutet dies, dass der erste Tag des Monats um einen Tag kürzer ist als der letzte Tag des Vormonats.

83voto

koni Punkte 39744

Ich würde ein Zwischendatum mit dem ersten Tag des nächsten Monats verwenden und das Datum vom Vortag zurückgeben:

int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);

41voto

Gone Coding Punkte 90304

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

31voto

lebreeze Punkte 5044

Mein Kollege ist auf die folgende Lösung gestoßen, die vielleicht einfacher ist

function daysInMonth(iMonth, iYear)
{
    return 32 - new Date(iYear, iMonth, 32).getDate();
}

gestohlen von http://snippets.dzone.com/posts/show/2099

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X