Jak wyliczyłbym różnicę dla dwóch obiektów Date () w JavaScript, zwracając tylko liczbę miesięcy różnicy?
Każda pomoc byłaby świetna :)
javascript
date
datediff
williamtroup
źródło
źródło
Odpowiedzi:
Definicja „liczby miesięcy różnicy” jest przedmiotem wielu interpretacji. :-)
Możesz pobrać rok, miesiąc i dzień miesiąca z obiektu daty JavaScript. W zależności od tego, jakich informacji szukasz, możesz ich użyć, aby dowiedzieć się, ile miesięcy dzieli się między dwoma punktami w czasie.
Na przykład, poza mankietem:
Pokaż fragment kodu
(Zwróć uwagę, że wartości miesiąca w JavaScript zaczynają się od 0 = styczeń).
Uwzględnienie ułamków miesięcy w powyższym jest znacznie bardziej skomplikowane, ponieważ trzy dni w typowym lutym to większy ułamek tego miesiąca (~ 10,714%) niż trzy dni w sierpniu (~ 9,677%) i oczywiście nawet luty jest celem ruchomym w zależności od tego, czy jest to rok przestępny.
Istnieją również biblioteki dat i godzin dostępne dla JavaScript, które prawdopodobnie ułatwiają tego rodzaju czynności.
Uwaga :
+ 1
w powyższym znajdował się znak , tutaj:To dlatego, że pierwotnie powiedziałem:
Usunąłem go z dwóch powodów:
Okazuje się, że nie liczenie niepełnych miesięcy nie jest tym, czego chce wiele (większość?) Osób przychodzących na odpowiedź, więc pomyślałem, że powinienem je oddzielić.
Nie zawsze działało, nawet w tej definicji. :-D (Przepraszam.)
źródło
Jeśli nie bierzesz pod uwagę dnia miesiąca, jest to zdecydowanie prostsze rozwiązanie
Należy pamiętać, że indeks miesiąca jest oparty na 0. Oznacza to, że
January = 0
iDecember = 11
.źródło
Czasami możesz chcieć uzyskać tylko liczbę miesięcy między dwiema datami, całkowicie ignorując część dzienną. Na przykład, jeśli miałeś dwie daty - 21.06.2013 i 21.10.2013 - i interesowały Cię tylko części 2013/06 i 2013/10, oto scenariusze i możliwe rozwiązania:
Jeśli chcesz podać tylko liczbę miesięcy między dwiema datami, z wyłączeniem miesiąca1 i miesiąca2
2. Jeśli chcesz uwzględnić którykolwiek z miesięcy
3. Jeśli chcesz uwzględnić oba miesiące
źródło
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
Oto funkcja, która dokładnie podaje liczbę miesięcy między dwiema datami.
Domyślne zachowanie liczy tylko całe miesiące, np. 3 miesiące i 1 dzień spowoduje różnicę 3 miesięcy. Możesz temu zapobiec, ustawiając
roundUpFractionalMonths
parametr jakotrue
, więc różnica 3 miesięcy i 1 dnia zostanie zwrócona jako 4 miesiące.Przyjęta powyżej odpowiedź (odpowiedź TJ Crowdera) nie jest dokładna, czasami zwraca nieprawidłowe wartości.
Na przykład
monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))
zwraca,0
co jest oczywiście błędne. Prawidłowa różnica to zaokrąglony w górę 1 cały miesiąc lub 2 miesiące.Oto funkcja, którą napisałem:
źródło
Jeśli musisz liczyć pełne miesiące, niezależnie od tego, czy miesiąc to 28, 29, 30 czy 31 dni. Poniżej powinno działać.
To jest rozszerzona wersja odpowiedzi https://stackoverflow.com/a/4312956/1987208, ale rozwiązuje przypadek, w którym oblicza 1 miesiąc dla sprawy od 31 stycznia do 1 lutego (1 dzień).
Obejmuje to następujące;
źródło
Różnica w miesiącach między dwiema datami w JavaScript:
łączna liczba miesięcy między datą_początkową a datą_końcową:
źródło
Wiem, że to naprawdę późno, ale i tak publikuję to na wypadek, gdyby to pomogło innym. Oto funkcja, którą wymyśliłem, która wydaje się dobrze zliczać różnice w miesiącach między dwiema datami. Jest to co prawda o wiele bardziej sprośne niż ten pana Crowdera, ale zapewnia dokładniejsze wyniki, przechodząc przez obiekt daty. Jest w AS3, ale powinieneś być w stanie porzucić mocne pisanie i będziesz mieć JS. Nie krępuj się, aby każdy wyglądał ładniej!
źródło
Rozważ każdą datę w kategoriach miesięcy, a następnie odejmij, aby znaleźć różnicę.
Dzięki temu uzyskasz różnicę miesięcy między dwiema datami, ignorując dni.
źródło
Aby rozwinąć odpowiedź @ TJ, jeśli szukasz prostych miesięcy zamiast pełnych miesięcy kalendarzowych, możesz po prostu sprawdzić, czy data d2 jest większa lub równa d1. Oznacza to, że jeśli d2 jest później w swoim miesiącu niż d1 w swoim miesiącu, to jest o 1 miesiąc więcej. Więc powinieneś być w stanie zrobić to po prostu:
Nie wyjaśnia to całkowicie problemów czasowych (np. 3 marca o 16:00 i 3 kwietnia o 15:00), ale jest dokładniejsze i obejmuje tylko kilka linijek kodu.
źródło
Istnieją dwa podejścia, matematyczne i szybkie, ale podlegające kaprysom w kalendarzu lub iteracyjne i powolne, ale radzi sobie ze wszystkimi osobliwościami (lub przynajmniej delegaci zajmujący się nimi do dobrze przetestowanej biblioteki).
Jeśli przeglądasz kalendarz, zwiększając datę początkową o jeden miesiąc i sprawdzając, czy minęliśmy datę końcową. Spowoduje to delegowanie obsługi anomalii do wbudowanych klas Date (), ale może być powolne, JEŚLI robisz to dla dużej liczby dat. Odpowiedź Jamesa przyjmuje takie podejście. Chociaż nie podoba mi się ten pomysł, myślę, że jest to „najbezpieczniejsze” podejście, a jeśli wykonujesz tylko jedno obliczenie, różnica w wydajności jest naprawdę znikoma. Staramy się nadmiernie optymalizować zadania, które zostaną wykonane tylko raz.
Teraz, jeśli obliczasz tę funkcję na zbiorze danych, prawdopodobnie nie chcesz uruchamiać tej funkcji w każdym wierszu (lub nie daj Boże, wiele razy na rekord). W takim przypadku możesz użyć prawie wszystkich innych odpowiedzi tutaj, z wyjątkiem zaakceptowanej odpowiedzi, która jest po prostu błędna (różnica między
new Date()
anew Date()
wynosi -1)?Oto moje podejście do matematycznego i szybkiego podejścia, które uwzględnia różne długości miesięcy i lata przestępne. Naprawdę powinieneś używać takiej funkcji tylko wtedy, gdy będziesz ją stosować do zbioru danych (wykonując te obliczenia w kółko). Jeśli musisz to zrobić tylko raz, użyj iteracyjnego podejścia Jamesa powyżej, ponieważ delegujesz obsługę wszystkich (wielu) wyjątków do obiektu Date ().
źródło
Oto inne podejście z mniejszą liczbą zapętleń:
źródło
Możesz również rozważyć to rozwiązanie, które
function
zwraca miesięczną różnicę w liczbie całkowitej lub liczbiePrzekazywanie daty rozpoczęcia jako pierwszej lub ostatniej
param
jest odporne na błędy. Oznacza to, że funkcja nadal zwracałaby tę samą wartość.źródło
Oblicz różnicę między dwiema datami z uwzględnieniem ułamka miesiąca (dni).
źródło
To powinno działać dobrze:
źródło
źródło
Poniższy kod zwraca pełne miesiące między dwiema datami, biorąc również pod uwagę liczbę dni niepełnych miesięcy.
źródło
}
źródło
poniżej logika pokaże różnicę w miesiącach
źródło
źródło
Zobacz czego używam:
źródło
źródło
Liczba miesięcy, w których dzień i godzina nie mają znaczenia
W tym przypadku nie interesują mnie pełne miesiące, część miesięcy, jak długi jest miesiąc itp. Po prostu muszę znać liczbę miesięcy. Odpowiednim przypadkiem w świecie rzeczywistym byłby przypadek składania sprawozdania co miesiąc, a ja muszę wiedzieć, ile powinno być zgłoszeń.
Przykład:
To jest rozbudowany przykład kodu, aby pokazać, dokąd zmierzają liczby.
Weźmy 2 znaczniki czasu, które powinny dać wynik za 4 miesiące
Może się nieznacznie różnić w zależności od wybranej strefy czasowej / czasu. Dzień, minuty i sekundy nie mają znaczenia i można je uwzględnić w sygnaturze czasowej, ale pominiemy to w naszych faktycznych obliczeniach.
Krok 1: przekonwertuj znacznik czasu na datę JavaScript
Krok 2: uzyskaj wartości całkowite dla miesięcy / lat
To nam daje
Krok 3: Dodaj
(12 * (endYear - startYear)) + 1
do miesiąca końcowego.2 + (12 * (2020 - 2019)) + 1 = 15
Krok 4: Odejmij miesiące
15 - 11 = 4
; otrzymujemy wynik za 4 miesiące.Przykład 29 miesięcy
Od listopada 2019 do marca 2022 trwa 29 miesięcy. Jeśli umieścisz je w arkuszu kalkulacyjnym programu Excel, zobaczysz 29 wierszy.
3 + (12 * (2022-2019)) + 1
40 - 11 = 29
źródło
źródło
Jednym z podejść byłoby napisanie prostej usługi WWW w języku Java (REST / JSON) korzystającej z biblioteki JODA
http://joda-time.sourceforge.net/faq.html#datediff
obliczyć różnicę między dwiema datami i zadzwonić do tej usługi z javascript.
Zakłada się, że Twoje zaplecze jest w Javie.
źródło