Używałem tej funkcji, ale chciałbym wiedzieć, jaki jest najbardziej skuteczny i dokładny sposób jej uzyskania.
function daysInMonth(iMonth, iYear) {
return 32 - new Date(iYear, iMonth, 32).getDate();
}
javascript
date
Chatu
źródło
źródło
return new Date(year, month + 1, 0).getDate();
var d=new Date();d.setFullYear(year, month, date);
.month
ma 12 lat ? CzyDate
konstruktor nie powinien przyjmować wartości od 0 do 11 ?Jeśli często wywołujesz tę funkcję, może być przydatne buforowanie wartości w celu uzyskania lepszej wydajności.
Oto wersja buforująca odpowiedzi FlySwat :
źródło
Date
(więc nie ma uniwersalnej odpowiedzi na to pytanie) i tego, jak często Twój kod będzie wywoływał metodędayInMonth
z tymi samymi wartościami. Więc jedyną rozsądną odpowiedzią jest: profiluj swój kod i testuj go!cache
używamlocalStorage
.Niektóre odpowiedzi (także na inne pytania) dotyczyły problemów z rokiem przestępnym lub wykorzystywały obiekt Date. Chociaż javascript
Date object
obejmuje około 285616 lat (100 000 000 dni) po obu stronach 1 stycznia 1970 r., Miałem dość wszelkiego rodzaju nieoczekiwanych niespójności dat w różnych przeglądarkach (zwłaszcza w latach od 0 do 99). Byłem też ciekawy, jak to obliczyć.Napisałem więc prosty, a przede wszystkim mały algorytm do obliczania poprawnej ( Proleptic Gregorian / Astronomical / ISO 8601: 2004 (punkt 4.3.2.1), więc rok
0
istnieje i jest rokiem przestępnym, a lata ujemne są obsługiwane ) liczby dni dla danego miesiąca i roku.Wykorzystuje algorytm zwarcia bitmask-modulo leapYear (nieznacznie zmodyfikowany dla js) i wspólny algorytm mod-8 miesięcy.
Zauważ, że w
AD/BC
notacji rok 0 AD / BC nie istnieje: zamiast tego rok1 BC
jest rokiem przestępnym!JEŚLI musisz uwzględnić notację BC, po prostu odejmij najpierw jeden rok (w przeciwnym razie dodatniej) wartości roku !! (Lub odejmij rok od
1
do dalszych obliczeń).Uwaga, miesiące muszą być liczone od 1!
Zauważ, że jest to inny algorytm niż magiczne wyszukiwanie liczb, których użyłem w moim JavaScript, aby obliczyć dzień roku (1 - 366) odpowiedź, ponieważ tutaj dodatkowa gałąź dla roku przestępnego jest potrzebna tylko dla lutego.
źródło
Aby wyeliminować zamieszanie, prawdopodobnie utworzyłbym ciąg miesiąca na podstawie, ponieważ obecnie jest oparty na 1.
źródło
Z moment.js możesz użyć metody daysInMonth ():
źródło
Oto idzie
źródło
Składnia ES6
zwroty
źródło
źródło
Biorąc pod uwagę lata przestępne:
źródło
Bezpośrednie obliczenia jednowierszowe (bez obiektu Date):
Odchylenie z miesiącami od 0:
źródło
Jeśli chcesz określić liczbę dni w bieżącym miesiącu obiektu Date, rozważ następującą metodę:
Następnie możesz uruchomić to w ten sposób:
źródło
W jednej linii:
źródło
Może być nieco przesadzone w porównaniu z wybraną odpowiedzią :) Ale oto jest:
Powyższy kod znalazłem tutaj: https://github.com/ElemeFE/element/blob/dev/src/utils/date-util.js
Powyższy kod znalazłem tutaj: https://github.com/datejs/Datejs/blob/master/src/core.js
źródło
Jeśli zamierzasz przekazać zmienną daty, może to być pomocne
źródło
Być może nie jest to najbardziej eleganckie rozwiązanie, ale łatwe do zrozumienia i utrzymania; i jest przetestowany w walce.
źródło