Wenn Sie 0
als dayValue
in Date.setFullYear
angeben, erhalten Sie den letzten Tag des Vormonats:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
Es gibt Hinweise auf dieses Verhalten bei Mozilla . Ist dies eine zuverlässige browserübergreifende Funktion oder sollte ich nach alternativen Methoden suchen?
javascript
date
Ken
quelle
quelle
Antworten:
Ausgabedifferenzen sind auf Unterschiede in der
toString()
Implementierung zurückzuführen, nicht auf unterschiedliche Daten.Nur weil die oben genannten Browser 0 als letzten Tag des Vormonats verwenden, bedeutet dies natürlich nicht, dass sie dies weiterhin tun oder dass nicht aufgelistete Browser dies tun, aber es verleiht der Überzeugung Glaubwürdigkeit, dass es funktionieren sollte in jedem Browser gleich.
quelle
new Date
ist so viel langsamer als andere Berechnungsmethoden , dass es nicht einmal auf dem perf Diagramm ist angezeigt : jsperf.com/days-in-month-perf-test/6Ich würde ein Zwischendatum mit dem ersten Tag des nächsten Monats verwenden und das Datum vom vorherigen Tag zurückgeben:
quelle
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
Ich finde das die beste Lösung für mich. Lassen Sie das Date-Objekt es für Sie berechnen.
Das Setzen des Tagesparameters auf 0 bedeutet einen Tag weniger als der erste Tag des Monats, der der letzte Tag des vorherigen Monats ist.
quelle
new Date
ist so viel langsamer, dass sie nicht einmal in der Perf-Tabelle angezeigt wirdIn Bezug auf Computer
new Date()
undregular expression
Lösungen sind langsam! Wenn Sie einen superschnellen (und superkryptischen) Einzeiler wünschen, versuchen Sie diesen (vorausgesetzt, erm
ist inJan=1
Format). Ich versuche immer wieder, verschiedene Codeänderungen vorzunehmen, um die beste Leistung zu erzielen.Meine aktuell schnellste Version:
Nachdem ich mir diese verwandte Frage mit Hilfe von bitweisen Operatoren (erstaunliche Geschwindigkeit) angesehen und herausgefunden habe, was die magische Zahl von 25 und 15 darstellt, habe ich diese optimierte Mischung von Antworten gefunden:
Angesichts der Bitverschiebung wird offensichtlich davon ausgegangen, dass Ihre
m
&y
-Parameter beide Ganzzahlen sind, da das Übergeben von Zahlen als Zeichenfolgen 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)
in fast allen Browsern.Die einzige echte Konkurrenz für Geschwindigkeit ist @GitaarLab, daher habe ich eine Kopf-an-Kopf-JSPerf erstellt, die wir testen können: http://jsperf.com/days-in-month-head-to-head/5
Es funktioniert basierend auf meiner Antwort auf das Schaltjahr hier: Javascript Schaltjahr finden diese Antwort hier Leap Jahr Prüfung mit Bitoperatoren (erstaunliche Geschwindigkeit) sowie die folgenden binäre Logik.
Eine kurze Lektion in zwei Monaten:
Wenn Sie den Index der gewünschten Monate interpretieren (Jan = 1) binär Sie feststellen, dass in Monaten mit 31 Tagen entweder Bit 3 gelöscht und Bit 0 gesetzt oder Bit 3 gesetzt und Bit 0 gelöscht ist.
Das bedeutet können Sie den Wert 3 Plätze mit verschieben
>> 3
, XOR die Bits mit dem Original^ m
und sehen , ob das Ergebnis1
oder0
in Bit - Position 0 mit& 1
. Hinweis: Es stellt sich heraus, dass+
es etwas schneller als XOR ist (^
) ist und(m >> 3) + m
in Bit 0 das gleiche Ergebnis liefert.JSPerf-Ergebnisse : http://jsperf.com/days-in-month-perf-test/6
quelle
:)
Die allererste Antwortversion, die ich gepostet habe, hatte tatsächlich einen nicht benötigten Satz Klammern, die entfernt wurden (was ich Ihnen gutgeschrieben habe), damit wir uns von einem Charakter rasieren und mit diesem enden konnten. Ich bin immer noch dankbar für diesen lustigen Tag, Prost!y
undm
Variablen müssen ganzzahlig sein, nicht string! Es verursacht falsche Berechnungen, zum Beispiel für Februar, es gibt 30 zurück. Ich musste dieparseInt()
Funktion verwenden, damit es funktioniert.Mein Kollege ist auf Folgendes gestoßen, was eine einfachere Lösung sein könnte
gestohlen von http://snippets.dzone.com/posts/show/2099
quelle
Eine geringfügige Änderung der von lebreeze bereitgestellten Lösung :
quelle
return new Date(iYear, 1 + iMonth, 0).getDate();
der Lösung von @ lebreeze entsprechen.Ich musste kürzlich etwas Ähnliches tun, das habe ich mir ausgedacht:
Übergeben Sie ein Datum, und es wird ein Datum zurückgegeben, das entweder auf den Monatsanfang oder das Monatsende festgelegt ist.
Die
begninngOfMonth
Funktion ist ziemlich selbsterklärend, aber was in derendOfMonth
Funktion vor sich geht, ist, dass ich den Monat auf den nächsten Monat inkrementiere und dann verwendesetDate(0)
den Tag auf den letzten Tag des vorherigen Monats zurücksetze, der Teil des ist setDate spec:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
Ich habe dann die Stunde / Minuten / Sekunden auf das Ende des Tages gesetzt, damit Sie, wenn Sie eine API verwenden, die einen Datumsbereich erwartet, den gesamten letzten Tag erfassen können. Dieser Teil könnte über das hinausgehen, was der ursprüngliche Beitrag verlangt, aber er könnte jemand anderem helfen, nach einer ähnlichen Lösung zu suchen.
Bearbeiten: Sie können auch die Extrameile gehen und Millisekunden einstellen,
setMilliseconds()
wenn Sie besonders präzise sein möchten.quelle
Probier diese.
Beispiel:
Ausgabe:
quelle
Das funktioniert bei mir. Gibt den letzten Tag des angegebenen Jahres und Monats an:
quelle
Dieser funktioniert gut:
quelle
Dies gibt Ihnen den ersten und letzten Tag des aktuellen Monats.
Wenn Sie 'Jahr' ändern müssen, entfernen Sie d.getFullYear () und legen Sie Ihr Jahr fest.
Wenn Sie 'Monat' ändern müssen, entfernen Sie d.getMonth () und legen Sie Ihr Jahr fest.
quelle
Versuche dies:
quelle
Die folgende Funktion gibt den letzten Tag des Monats an:
Ebenso können wir den ersten Tag des Monats bekommen:
quelle
quelle
quelle
Stellen Sie den Monat ein, den Sie datieren müssen, und setzen Sie dann den Tag auf Null, sodass der Monat in der Datumsfunktion 1 - 31 beginnt und dann den letzten Tag erhält ^^
quelle
Hier ist eine Antwort, bei der GMT und die Uhrzeit des ursprünglichen Datums erhalten bleiben
quelle
Ich weiß, dass es nur um Semantik geht, aber ich habe es letztendlich in dieser Form verwendet.
Da Funktionen vom inneren Argument nach außen aufgelöst werden, funktioniert es genauso.
Sie können dann einfach das Jahr und den Monat / das Jahr durch die erforderlichen Details ersetzen, unabhängig davon, ob es sich um das aktuelle Datum handelt. Oder einen bestimmten Monat / ein bestimmtes Jahr.
quelle
Wenn Sie das genaue Monatsende in Millisekunden benötigen (z. B. in einem Zeitstempel):
quelle