Jak uzyskać liczbę dni między dwiema datami w JavaScript? Na przykład podane dwie daty w polach wejściowych:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
javascript
date
Michael Haren
źródło
źródło
Odpowiedzi:
Oto szybkie i nieprzyzwoite wdrożenie
datediff
, będące dowodem koncepcji rozwiązania problemu przedstawionego w pytaniu. Opiera się na fakcie, że można uzyskać upływające milisekundy między dwiema datami, odejmując je, co wymusza ich pierwotną wartość liczbową (milisekundy od początku 1970 r.).Należy pamiętać, że „normalne” interfejsy API daty (bez nazwy „UTC” w nazwie) działają w lokalnej strefie czasowej przeglądarki użytkownika, więc ogólnie możesz mieć problemy, jeśli użytkownik znajduje się w strefie czasowej, której nie znasz spodziewaj się, a Twój kod będzie musiał radzić sobie z przejściami czasu letniego. Powinieneś uważnie przeczytać dokumentację dotyczącą obiektu Date i jego metod, a w przypadku bardziej skomplikowanych przypadków zdecydowanie rozważ użycie biblioteki, która oferuje bezpieczniejsze i wydajniejsze interfejsy API do manipulowania datami.
Date
- Odwołanie do MDN JavaScriptRównież w celach ilustracyjnych fragment używa nazwanego dostępu do
window
obiektu dla zwięzłości, ale w produkcji należy używać standardowych interfejsów API, takich jak getElementById lub, bardziej prawdopodobne, niektóre struktury interfejsu użytkownika.źródło
parseDate
metodę na:return new Date(mdy[2], mdy[1], mdy[0]-1);
W chwili pisania tego tekstu tylko jedna z pozostałych odpowiedzi poprawnie obsługuje przejścia DST (czas letni). Oto wyniki dla systemu zlokalizowanego w Kalifornii:
Chociaż
Math.round
zwraca poprawne wyniki, myślę, że jest trochę niezgrabny. Zamiast tego, jawnie rozliczając zmiany przesunięcia UTC, gdy DST zaczyna się lub kończy, możemy użyć dokładnej arytmetyki:Wyjaśnienie
Obliczanie daty w JavaScript jest trudne, ponieważ
Date
obiekty przechowują czasy wewnętrznie w UTC, a nie w czasie lokalnym. Na przykład 03.10.2013 12:00 czasu pacyficznego (UTC-08: 00) jest zapisywany jako 3/10/2013 8:00 UTC, a 03.11.2013 12:00 czasu pacyficznego ( UTC-07: 00) jest przechowywany jako 3/11/2013 7:00 AM UTC. Tego dnia od północy do północy czasu lokalnego jest tylko 23 godziny w UTC!Chociaż dzień w czasie lokalnym może trwać mniej więcej 24 godziny, dzień w UTC jest zawsze dokładnie 24 godziny. 1 The
daysBetween
sposób przedstawiony powyżej wykorzystuje ten fakt przez pierwsze powołanietreatAsUTC
do regulacji zarówno razy lokalne do północy UTC, zanim odejmowanie i dzielenie.1. JavaScript ignoruje sekundy przestępne.
źródło
Date.UTC(...)
najpierw przeanalizuj ciągi znaków .Najłatwiejszy sposób na uzyskanie różnicy między dwiema datami:
Otrzymujesz różnicę dni (lub NaN, jeśli nie można przeanalizować jednego lub obu). Data analizy dała wynik w milisekundach. Aby uzyskać go w ciągu dnia, należy go podzielić przez 24 * 60 * 60 * 1000
Jeśli chcesz podzielić go na dni, godziny, minuty, sekundy i milisekundy:
Oto moja refaktoryzowana wersja Jamesa:
źródło
Polecam korzystanie z biblioteki moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Prawidłowo radzi sobie z czasem letnim i ogólnie jest świetny do pracy.
Przykład:
źródło
end.diff(start,"days")
chociaż napisany kod będzie działał, ponieważ data początkowa jest późniejsza niż data końcowa!Pójdę do przodu i wezmę to małe narzędzie, w którym znajdziesz dla niego funkcje. Oto krótki przykład:
źródło
Aktualizacja: Wiem, że nie jest to częścią twoich pytań, ale ogólnie nie zalecałbym wykonywania żadnych obliczeń ani manipulacji datą w waniliowym JavaScript, a raczej do tego używaj biblioteki typu date-fns lub moment.js z powodu wielu przypadków krawędzi.
źródło
timeDiff
powróciłem przecząco? Nie powinnotimeDiff
być(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Korzystanie z Moment.js
źródło
var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays);
więcej tutaj: momentjs.comWartości daty w JS są wartościami daty i godziny.
Zatem bezpośrednie obliczenia daty są niespójne:
na przykład musimy przekonwertować drugą datę:
metoda może obciąć młyny w obu datach:
źródło
Lepiej pozbyć się DST, Math.ceil, Math.floor itp., Używając czasów UTC:
Ten przykład daje różnicę 109 dni.
24*60*60*1000
jest jeden dzień w milisekundach.źródło
Aby obliczyć dni między 2 podanymi datami, możesz użyć następującego kodu. Daty, których tu używam, to 01 stycznia 2016 i 31 grudnia 2016
źródło
Można obliczyć różnicę dni pełnego dowodu między dwiema datami spoczywającymi w różnych strefach czasowych przy użyciu następującego wzoru:
źródło
Znalazłem to pytanie, gdy chcę wykonać obliczenia na dwóch datach, ale data ma wartość godzin i minut, zmodyfikowałem odpowiedź @ michael-liu, aby dopasować ją do moich wymagań, i przeszła mój test.
różne dni
2012-12-31 23:00
i2013-01-01 01:00
powinna wynosić 1. (2 godziny) diff dni2012-12-31 01:00
i2013-01-01 23:00
powinna wynosić 1. (46 godzin)źródło
przykład jsfiddle :)
źródło
Myślę, że rozwiązania nie są poprawne 100% Chciałbym użyć sufitu zamiast podłogi , okrągły zadziała, ale to nie jest właściwa operacja.
źródło
Co powiesz na użycie formatDate z widżetu DatePicker? Można go użyć do konwersji dat w formacie znacznika czasu (w milisekundach od 01.01.1970), a następnie wykonać proste odejmowanie.
źródło
źródło
To może nie być najbardziej eleganckie rozwiązanie, ale wydaje mi się, że odpowiada na to pytanie za pomocą stosunkowo prostego fragmentu kodu. Nie możesz użyć czegoś takiego:
Zakłada się, że przekazujesz obiekty daty jako parametry.
źródło
Jeśli masz dwa uniksowe znaczniki czasu, możesz użyć tej funkcji (nieco bardziej szczegółowej ze względu na przejrzystość):
Przykład:
źródło
Zachowaj ostrożność podczas używania milisekund .
Metoda date.getTime () zwraca milisekundy, a wykonywanie operacji matematycznych z milisekundami wymaga uwzględnienia
Przykład z powyższego komentarza jest najlepszym rozwiązaniem, jakie do tej pory znalazłem https://stackoverflow.com/a/11252167/2091095 . Ale użyj +1 do jego wyniku, jeśli chcesz liczyć wszystkie zaangażowane dni.
źródło
źródło
Miałem ten sam problem w Angular. Robię kopię, bo inaczej zastąpi pierwszą randkę. Obie daty muszą mieć czas 00:00:00 (oczywiście)
źródło
Użyłem poniższego kodu, aby wypróbować funkcjonalność daty opublikowania wiadomości. Obliczam minutę, godzinę, dzień lub rok na podstawie daty i bieżącej daty.
źródło
jeśli chcesz mieć DateArray z datami, spróbuj tego:
DebugSnippet
źródło
Prostym sposobem obliczania dni między dwiema datami jest usunięcie obu ich składników czasu, tj. Ustawienie godzin, minut, sekund i milisekund na 0, a następnie odjęcie czasu i nurkowanie go z milisekundami o wartości jednego dnia.
źródło
new Date
źródło
Prosty łatwy i wyrafinowany. Ta funkcja będzie wywoływana co 1 sekundę w celu aktualizacji czasu.
źródło
Lepsze rozwiązanie
zwróci 0, jeśli obie daty są takie same.
źródło
Wkład za datę przed 1970-01-01 i po 2038-01-19
źródło
źródło
Możesz użyć UnderscoreJS do formatowania i obliczania różnicy.
Demo https://jsfiddle.net/sumitridhal/8sv94msp/
źródło