Jeśli podasz 0
jako dayValue
w Date.setFullYear
, otrzymasz ostatni dzień poprzedniego miesiąca:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
W Mozilli istnieje odniesienie do tego zachowania . Czy jest to niezawodna funkcja przeglądarki, czy powinienem spojrzeć na alternatywne metody?
javascript
date
Rozpoznać
źródło
źródło
Odpowiedzi:
Różnice w wynikach wynikają z różnic we
toString()
wdrażaniu, a nie dlatego, że daty są różne.Oczywiście fakt, że wyżej wymienione przeglądarki używają 0 jako ostatniego dnia poprzedniego miesiąca, nie oznacza, że będą to robić dalej, lub że przeglądarki niewymienione na liście to zrobią, ale nadaje to wiarygodności przekonaniu, że powinno działać w ten sam sposób w każdej przeglądarce.
źródło
new Date
jest o wiele wolniejsze niż w przypadku innych metod obliczeniowych, że nawet nie pojawia się na wykresie perf : jsperf.com/days-in-month-perf-test/6Użyłbym daty pośredniej z pierwszym dniem następnego miesiąca i zwróciłbym datę z poprzedniego dnia:
źródło
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
Uważam to za najlepsze rozwiązanie dla mnie. Pozwól obiektowi Data go obliczyć.
Ustawienie parametru dnia na 0 oznacza jeden dzień mniej niż pierwszy dzień miesiąca, który jest ostatnim dniem poprzedniego miesiąca.
źródło
new Date
jest o wiele wolniejsze, nawet nie pojawia się na wykresie perf : jsperf.com/days-in-month-perf-test/6W kategoriach komputerowych,
new Date()
aregular expression
rozwiązania są powolne! Jeśli chcesz superszybkiego (i super-kryptycznego) jedno-liniowego, wypróbuj ten (zakładając, żem
maJan=1
format). Próbuję różnych zmian kodu, aby uzyskać najlepszą wydajność.Moja aktualna najszybsza wersja:
Po przeanalizowaniu tego powiązanego pytania Sprawdź rok przestępny za pomocą operatorów bitowych (niesamowita prędkość) i odkryłem, co reprezentuje magiczna liczba 25 i 15, wymyśliłem tę zoptymalizowaną hybrydę odpowiedzi:
Biorąc pod uwagę przesunięcie bitów, to oczywiście zakłada, że obie parametry
m
iy
parametry są liczbami całkowitymi, ponieważ przekazywanie liczb jako ciągów spowoduje dziwne wyniki.JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Wyniki JSPerf: http://jsperf.com/days-in-month-head-to-head/5
Z jakiegoś powodu
(m+(m>>3)&1)
jest bardziej wydajny niż(5546>>m&1)
w prawie wszystkich przeglądarkach.Jedyną prawdziwą konkurencją dla prędkości jest @GitaarLab, więc stworzyłem JSPerf head-to-head do przetestowania na: http://jsperf.com/days-in-month-head-to-head/5
Działa w oparciu o moją odpowiedź na rok przestępny tutaj: javascript, aby znaleźć rok przestępny tę odpowiedź tutaj Sprawdzanie roku przestępnego za pomocą operatorów bitowych (niesamowita prędkość), a także następującą logikę binarną.
Szybka lekcja w miesiącach binarnych:
Jeśli interpretujesz indeks żądanych miesięcy (Jan = 1) w systemie binarnym , zauważysz, że miesiące z 31 dniami mają albo bit 3 skasowany i bit ustawiony 0, albo bit 3 ustawiony i bit 0 czysty.
Oznacza to, że możesz przesunąć wartość o 3 miejsca za pomocą
>> 3
, XOR bitów z oryginałem^ m
i sprawdzić, czy wynikiem jest1
lub0
w pozycji bitu 0 za pomocą& 1
. Uwaga: Okazuje się, że+
jest nieco szybszy niż XOR (^
) i(m >> 3) + m
daje ten sam wynik w bicie 0.Wyniki JSPerf : http://jsperf.com/days-in-month-perf-test/6
źródło
:)
Pierwsza opublikowana przeze mnie wersja odpowiedzi zawierała niepotrzebny zestaw nawiasów, które zostały usunięte (za co ci przypisałem), abyśmy mogli się ogolić i skończyć z tym. Wciąż jestem wdzięczny za ten zabawny dzień, zdrowie!y
am
zmienne muszą być liczbą całkowitą, a nie ciągiem! Powoduje to błędne obliczenia, na przykład dla lutego zwraca 30. Musiałem użyćparseInt()
funkcji, aby to działało.Mój kolega natknął się na następujące, co może być łatwiejszym rozwiązaniem
skradziony z http://snippets.dzone.com/posts/show/2099
źródło
Niewielka modyfikacja rozwiązania dostarczonego przez Lebreeze :
źródło
return new Date(iYear, 1 + iMonth, 0).getDate();
być równoważne rozwiązaniu @ lebreeze.Niedawno musiałem zrobić coś podobnego, oto co wymyśliłem:
Podaj datę, a zwróci datę ustawioną na początek miesiąca lub na koniec miesiąca.
Ta
begninngOfMonth
funkcja jest dość oczywista, ale w tejendOfMonth
funkcji zwiększam miesiąc do następnego, a następnie używamsetDate(0)
cofnąć dzień do ostatniego dnia poprzedniego miesiąca, który jest częścią specyfikacja setDate:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp
Następnie ustawiam godzinę / minuty / sekundy na koniec dnia, więc jeśli używasz jakiegoś interfejsu API, który oczekuje zakresu dat, będziesz w stanie uchwycić całość tego ostatniego dnia. Ta część może wykraczać poza to, o co prosi oryginalny post, ale może pomóc komuś innemu szukając podobnego rozwiązania.
Edycja: Możesz także przejść o wiele więcej i ustawić milisekundy,
setMilliseconds()
jeśli chcesz być bardziej precyzyjny.źródło
Spróbuj tego.
przykład:
wynik:
źródło
To działa dla mnie. Zapewni ostatni dzień danego roku i miesiąca:
źródło
Ten działa ładnie:
źródło
To da ci bieżący miesiąc pierwszy i ostatni dzień.
Jeśli chcesz zmienić „rok”, usuń d.getFullYear () i ustaw swój rok.
Jeśli chcesz zmienić „miesiąc”, usuń d.getMonth () i ustaw rok.
źródło
Spróbuj tego:
źródło
Poniższa funkcja podaje ostatni dzień miesiąca:
Podobnie możemy uzyskać pierwszy dzień miesiąca:
źródło
źródło
źródło
ustaw miesiąc, którego potrzebujesz, a następnie ustaw dzień na zero, więc miesiąc zacznij od 1 - 31 w funkcji daty, a następnie uzyskaj ostatni dzień ^^
źródło
Oto odpowiedź, która zachowuje czas GMT i datę początkową
źródło
Wiem, że to tylko kwestia semantyki, ale ostatecznie użyłem tego w tej formie.
Ponieważ funkcje są rozwiązywane z argumentu wewnętrznego, na zewnątrz działa tak samo.
Następnie możesz po prostu zastąpić rok i miesiąc / rok wymaganymi szczegółami, niezależnie od tego, czy pochodzą one z bieżącej daty. Lub konkretnego miesiąca / roku.
źródło
Jeśli potrzebujesz dokładnego końca miesiąca w milisekundach (na przykład znacznik czasu):
źródło