var d = new Date();
d.setMonth(d.getMonth() - 3);
To działa na styczeń. Uruchom ten fragment:
var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
Jest kilka zastrzeżeń ...
Miesiąc to ciekawa sprawa. Jak definiujesz 1 miesiąc? 30 dni? Większość ludzi powie, że miesiąc temu oznacza ten sam dzień miesiąca, w którym potrzebne jest cytowanie z poprzedniego miesiąca . Ale więcej niż połowa czasu, czyli 31 dni temu, a nie 30. A jeśli dzisiaj jest 31 dzień miesiąca (a nie jest to sierpień ani grudzień), to ten dzień miesiąca nie istnieje w poprzednim miesiącu.
Co ciekawe, Google zgadza się z JavaScriptem, jeśli zapytasz go, jaki dzień jest miesiąc przed kolejnym :
Mówi się również, że jeden miesiąc ma 30,4167 dni :
Czy zatem miesiąc przed 31 marca jest tym samym dniem, co miesiąc przed 28 marca, a 3 dni wcześniej? Wszystko zależy od tego, co masz na myśli, mówiąc „miesiąc wcześniej”. Porozmawiaj z właścicielem produktu.
Jeśli chcesz zrobić to, co robi momentjs i poprawić te błędy ostatniego dnia miesiąca, przechodząc do ostatniego dnia miesiąca, możesz zrobić coś takiego:
const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());
Jeśli twoje wymagania są bardziej skomplikowane, użyj trochę matematyki i napisz kod. Jesteś programistą! Nie musisz instalować biblioteki! Nie musisz kopiować i wklejać ze stosu overflow! Możesz samodzielnie opracować kod, aby robić dokładnie to, czego potrzebujesz!
Polecam korzystanie z biblioteki o nazwie Moment.js.
Jest dobrze przetestowany, działa na różnych przeglądarkach i po stronie serwera (używam go zarówno w projektach Angular, jak i Node). Ma świetne wsparcie dla dat lokalnych.
http://momentjs.com/
.format()
zwraca ciąg znaków reprezentujący datę w formacie ISO 8601 . Możesz go również używać z niestandardowym formatem daty, takim jak ten:.format('dddd, MMMM Do YYYY, h:mm:ss a')
źródło
„Jedna linijka” (w wielu wierszach w celu ułatwienia odczytu)) do umieszczenia bezpośrednio w zmiennej:
źródło
Aby uprościć sprawę, możesz użyć DateJS, biblioteki dat dla JavaScript:
http://www.datejs.com/
Przykładowy kod dla Ciebie:
źródło
Powinno to obsługiwać dodawanie / odejmowanie, po prostu wstaw wartość ujemną, aby odjąć, i wartość dodatnią, aby dodać. To również rozwiązuje problem krzyżowania się miesiąca.
źródło
Jeśli
setMonth
metoda oferowana przez gilly3 nie jest tym, czego szukasz, rozważ:Może być używany przez dowolny czas, wystarczy ustawić odpowiednią wielokrotność.
źródło
Date
Choć klasa jest słaba i choć preferowany jest Date.js, przynajmniej modeluje łagodny kalendarz proleptyczny, który jest wystarczająco dobry do codziennego użytku.setTime()
?Podoba mi się prostota odpowiedzi gilly3 , ale użytkownicy prawdopodobnie będą zaskoczeni, że miesiąc przed 31 marca to 3 marca. Zdecydowałem się zaimplementować wersję, która trzyma się do końca miesiąca, a więc miesiąc przed 28, 29, 30 marca a 31 będzie 28 lutego, kiedy to nie jest rok przestępny.
źródło
Jest już elegancka odpowiedź, ale uważam, że jest trudna do odczytania, więc stworzyłem własną funkcję. Do moich celów nie potrzebowałem wyniku ujemnego, ale nie byłbym trudny do zmodyfikowania.
źródło
źródło
To jest najmniejszy i najłatwiejszy kod.
Zadeklaruj zmienną, która ma aktualną datę. następnie używając wbudowanej funkcji setMonth możemy uzyskać datę wsteczną o 3 miesiące.
źródło
W moim przypadku musiałem odjąć 1 miesiąc od daty bieżącej. Ważną częścią był numer miesiąca, więc nie obchodzi go, w którym dniu bieżącego miesiąca jesteś, potrzebowałem ostatniego miesiąca. To jest mój kod:
Odejmowanie 1 miesiąca od aktualnej daty nie jest dokładne, dlatego na pierwszym miejscu ustawiam pierwszy dzień miesiąca (pierwszy dzień każdego miesiąca jest zawsze pierwszym dniem) a na drugim miejscu odejmuję 1 dzień, który zawsze przesyła do ostatniego miesiąca. Mam nadzieję, że ci pomogę.
źródło
źródło
Przekaż obiekt JS Date i liczbę całkowitą określającą, ile miesięcy chcesz dodać / odjąć.
monthsToAdd
może być pozytywne lub negatywne. Zwraca obiekt daty JS.Jeśli masz
originalDateObject
31 marca i przekroczysz -1 jakomonthsToAdd
, to datą wyjściową będzie 28 lutego.Jeśli miniesz dużą liczbę miesięcy, powiedzmy 36, to również odpowiednio poradzi sobie z dostosowaniem roku.
źródło
źródło
źródło