Szukam najłatwiejszego i najczystszego sposobu na dodanie X miesięcy do daty JavaScript.
Wolałbym nie radzić sobie z upływem roku ani pisać własnej funkcji .
Czy jest coś wbudowanego, co może to zrobić?
javascript
date
Czad
źródło
źródło
Odpowiedzi:
Poniższa funkcja dodaje miesiące do daty w JavaScript ( źródło ). Bierze pod uwagę okresy odnowienia roku i różne długości miesięcy:
Powyższe rozwiązanie obejmuje przypadek przejścia od miesiąca z większą liczbą dni niż miesiąc docelowy. na przykład.
Jeśli dzień miesiąca zmienia się podczas składania wniosku
setMonth
, wiemy, że przelaliśmy się na następny miesiąc z powodu różnicy długości miesiąca. W takim przypadku używamy,setDate(0)
aby wrócić do ostatniego dnia poprzedniego miesiąca.Uwaga: ta wersja tej odpowiedzi zastępuje wcześniejszą wersję (poniżej), która nie obsługiwała z wdziękiem różnych długości miesięcy.
źródło
addMonths
funkcja , która uwzględnia koniec miesiąca (np.2012-01-31 + 1 month = 2012-02-29
Itd.).Używam moment.js bibliotekę do manipulacji Date-Time . Przykładowy kod do dodania jeden miesiąc:
źródło
Ta funkcja obsługuje przypadki krawędzi i jest szybka:
test:
Aktualizacja dla dat poza UTC: (autor: A.Hatchkins)
test:
źródło
Biorąc pod uwagę, że żadna z tych odpowiedzi nie uwzględni bieżącego roku, w którym zmienia się miesiąc, poniżej znajdziesz jedną, którą zrobiłem:
Metoda:
Stosowanie:
źródło
Zaczerpnięte z odpowiedzi @bmpsini i @Jazaret , ale bez rozszerzania prototypów: używanie prostych funkcji ( dlaczego rozszerzanie rodzimych obiektów jest złą praktyką? ):
Użyj tego:
źródło
Z powyższych odpowiedzi, jedyny, który obsługuje przypadki brzegowe (bmpasini z biblioteki datejs) ma problem:
dobrze, ale:
gorzej:
Wynika to z braku ustawienia czasu, a tym samym powrotu do 00:00:00, który następnie może przejść do poprzedniego dnia ze względu na strefę czasową lub zmiany oszczędzające czas lub cokolwiek ...
Oto moje proponowane rozwiązanie, które nie ma tego problemu, a także, jak sądzę, jest bardziej eleganckie, ponieważ nie opiera się na zakodowanych wartościach.
Jednostka pomyślnie przetestowana z:
źródło
Jak podkreślono większość odpowiedzi, moglibyśmy użyć metody setMonth () wraz z metodą getMonth () , aby dodać określoną liczbę miesięcy do określonej daty.
Przykład: (jak wspomniano w odpowiedzi @ChadD).
Ale powinniśmy ostrożnie korzystać z tego rozwiązania, ponieważ będziemy mieć problemy z przypadkowymi skrzynkami.
Do obsługi przypadków na krawędziach pomocna jest odpowiedź podana w poniższym linku.
https://stackoverflow.com/a/13633692/3668866
źródło
Proste rozwiązanie:
2678400000
trwa 31 dni w milisekundachAktualizacja:
Użyj tych danych, aby zbudować naszą własną funkcję:
2678400000
- 31 dzień2592000000
- 30 dni2505600000
- 29 dni2419200000
- 28 dniźródło
Miesiące mają indeks oparty na 0, powinien ostrzec (4), który jest 5 (może);
źródło
Aby dodać do zaakceptowanej odpowiedzi i komentarzy.
źródło
Napisałem to alternatywne rozwiązanie, które działa dobrze dla mnie. Jest to przydatne, gdy chcesz obliczyć koniec umowy. Na przykład: początek = 15.01.2016, miesiące = 6, koniec = 2016-7-14 (tj. Ostatni dzień - 1):
Przykłady:
źródło
Poniżej przedstawiono przykład obliczania przyszłej daty na podstawie danych wejściowych (data członkostwa) i dodanych miesięcy (miesiące członkostwa) za pomocą pól formularza.
Pole członkostwo w miesiącach ma domyślną wartość 0
Link wyzwalający (może być zdarzeniem onchange dołączonym do pola okresu członkostwa):
źródło
Jak pokazują liczne złożone, brzydkie odpowiedzi, Daty i Czasy mogą być koszmarem dla programistów posługujących się dowolnym językiem. Moje podejście polega na konwertowaniu dat i wartości „delta t” na czas epoki (w ms), wykonaniu dowolnej arytmetyki, a następnie konwersji z powrotem na „czas ludzki”.
Zostało to napisane dla nieco innego przypadku użycia, ale powinieneś być w stanie łatwo dostosować go do powiązanych zadań.
EDYCJA: Pełne źródło tutaj !
źródło
Wszystko to wydaje się zbyt skomplikowane i myślę, że zaczyna się debata na temat tego, co dokładnie oznacza „miesiąc”. Czy to znaczy 30 dni? Czy to oznacza od 1 do 1? Od ostatniego dnia do ostatniego dnia?
Jeśli to drugie, to dodanie miesiąca do 27 lutego spowoduje przejście do 27 marca, ale dodanie miesiąca do 28 lutego spowoduje przejście do 31 marca (z wyjątkiem lat przestępnych, w których dochodzi do 28 marca). Odejmując miesiąc od 30 marca dostajesz ... 27 lutego? Kto wie...
Dla tych, którzy szukają prostego rozwiązania, wystarczy dodać milisekundy i gotowe.
lub
źródło
d.setMonth(d.getMonth()+1)
? To nie jest nawet najprostszy pomysł.źródło
Czasami przydatne jest utworzenie daty przez jednego operatora, jak w parametrach BIRT
Zrobiłem 1 miesiąc z powrotem z:
źródło
Zgodnie z powyższą metodą możesz dodać miesiąc do
Date
działania.źródło