Jak obliczyć liczbę dni między dwiema datami


282

Mam dwie daty wejściowe pobrane z kontrolki Date Picker. Wybrałem datę początkową 2/2/2012 i datę końcową 2/7/2012. W tym celu napisałem następujący kod.

Powinienem otrzymać wynik jako 6, ale dostaję 5.

function SetDays(invoker) {   
    var start = $find('<%=StartWebDatePicker.ClientID%>').get_value();
    var end = $find('<%=EndWebDatePicker.ClientID%>').get_value();

    var oneDay=1000 * 60 * 60 * 24;
    var difference_ms = Math.abs(end.getTime() - start.getTime())
    var diffValue = Math.round(difference_ms / oneDay);
}

Czy ktoś może mi powiedzieć, jak mogę uzyskać dokładną różnicę?


dlaczego powinieneś dostać wynik = 6 ??? 07 - 02 = 05 dni ....
André Alçada Padez

1
Ale zakres dni od 2 do 7 wynosi 2,3,4,5,6,7 = 6 dni.
Supr

Biorąc różnicę, chcę również wziąć pod uwagę datę rozpoczęcia ....
Vaibhav Deshmukh

17
Cóż ... dlaczego nie dodać 1 do odpowiedzi?
Pointy

Problem (jeśli w ogóle występuje problem) jest funkcjonalny, a nie techniczny. @Pointy komentarz jest odpowiedzią. Dlatego niektórzy pytają, dlaczego jesteśmy w XXI wieku.
Leandro,

Odpowiedzi:


666

http://momentjs.com/ lub https://date-fns.org/

Z dokumentów Moment:

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days')   // =1

lub dołączyć początek:

a.diff(b, 'days')+1   // =2

Ręczne pokonanie bałaganu ze znacznikami czasu i strefami czasowymi.

W zależności od konkretnego przypadku użycia możesz albo

  1. Użyj a/b.startOf('day')i / lub, a/b.endOf('day')aby zmusić różnicę do włączenia lub wyłączenia na „końcach” (jak sugeruje @kotpal w komentarzach).
  2. Set trzeci argument true, aby uzyskać zmiennoprzecinkowych diff które można następnie Math.floor, Math.ceillub Math.roundw razie potrzeby.
  3. Wariant 2 można również osiągnąć, uzyskując 'seconds'zamiast, 'days'a następnie dzieląc 24*60*60.

30
moment.js da wartość ujemną, jeśli a <b. Bardziej wiarygodne obliczenia byłyby zatem następujące: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Pamiętaj, aby zignorować część czasu - inaczej uzyskasz różne wyniki dla tej samej daty, ale z różnymi czasami (np. Z kontrolki wyboru daty). użyj moment (someDate) .startOf („dzień”), aby jawnie ustawić część czasu na 00:00:00 przed wykonaniem różnicy (lub innych operacji, które są wrażliwe na część czasu obiektu Date / moment)
kotpal

Działa to, ale nie uwzględnia składnika czasu. Próba różnicowania między następującymi dwiema parami: (a = „2017-12-24T00: 00: 00Z” i „b = 2017-12-31T23: 59: 59Z”) oraz (a = „2017-12-24T23: 00 : 00Z ”ib =„ 2017-12-31T23: 59: 59Z ”). return b.diff (a, „days”) <= 7; oba zwracają prawdę. Czy istnieje sposób na włączenie komponentu czasu do diff?
Roobie

1
+1 dla startOf () i endOf (). Korzystałem z tej biblioteki od kilku lat i nigdy wcześniej ich nie zauważyłem. Zawsze robiłem +1.
Mike Devenney

3
Pamiętaj, że to startOfmutuje chwilę. Jeśli tego nie chcesz, to rób a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Jeśli używasz mom.js , możesz to zrobić z łatwością.

var start = moment("2018-03-10", "YYYY-MM-DD");
var end = moment("2018-03-15", "YYYY-MM-DD");

//Difference in number of days
moment.duration(start.diff(end)).asDays();

//Difference in number of weeks
moment.duration(start.diff(end)).asWeeks();

Jeśli chcesz znaleźć różnicę między daną datą a bieżącą datą w liczbie dni (ignorując czas), pamiętaj o usunięciu czasu z obiektu momentu bieżącej daty, jak poniżej

moment().startOf('day')

Aby znaleźć różnicę między daną datą a bieżącą datą w liczbie dni

var given = moment("2018-03-10", "YYYY-MM-DD");
var current = moment().startOf('day');

//Difference in number of days
moment.duration(given.diff(current)).asDays();

2
asDays () zwrócił mi niektóre wartości dziesiętne. Używam, current.diff(given, 'days')więc zaokrągla w górę.
Vincent

@ Vincent wydaje się, że używasz tego w niewłaściwy sposób. jest to zdecydowanie bardziej czyste rozwiązanie, wynik jest słuszny w porównaniu z odpowiedzią @Supr, w której 1zgubiono a
Nwawel A Iroume

15

Próbować:

//Difference in days

var diff =  Math.floor(( start - end ) / 86400000);
alert(diff);

Myślę, że jest to w zasadzie słuszne, ale czy zasadniczo nie jest takie samo, jak w OP?
Pointy

Ze względu na sposób, w jaki to napisał, nie zauważyłem, ale tak, właściwie! : P
Richard

5
Nie lubię magicznych liczb ... byłoby lepiej, gdyby liczba ta została podzielona na samooczyszczające się równanie
vsync

7

Wypróbuj to za pomocą mom.js (dość łatwo obliczyć operacje daty w javascript)

firstDate.diff (secondDate, „dni”, false); // true | false dla wartości ułamkowej

Wynik da ci liczbę dni w liczbach całkowitych.


oto podpis: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Sumit

1

Możesz także użyć tego kodu: moment („twojaDataHere”, „RRRR-MM-DD”). FromNow (). To obliczy różnicę między dniem dzisiejszym a podaną datą.


1

To działa dla mnie:

const from = '2019-01-01';
const to   = '2019-01-08';

Math.abs(
    moment(from, 'YYYY-MM-DD')
      .startOf('day')
      .diff(moment(to, 'YYYY-MM-DD').startOf('day'), 'days')
  ) + 1
);


1

Zrobiłem szybką funkcję wielokrotnego użytku w ES6 za pomocą Moment.js.

const getDaysDiff = (start_date, end_date, date_format = 'YYYY-MM-DD') => {
  const getDateAsArray = (date) => {
    return moment(date.split(/\D+/), date_format);
  }
  return getDateAsArray(end_date).diff(getDateAsArray(start_date), 'days') + 1;
}

console.log(getDaysDiff('2019-10-01', '2019-10-30'));
console.log(getDaysDiff('2019/10/01', '2019/10/30'));
console.log(getDaysDiff('2019.10-01', '2019.10 30'));
console.log(getDaysDiff('2019 10 01', '2019 10 30'));
console.log(getDaysDiff('+++++2019!!/###10/$$01', '2019-10-30'));
console.log(getDaysDiff('2019-10-01-2019', '2019-10-30'));
console.log(getDaysDiff('10-01-2019', '10-30-2019', 'MM-DD-YYYY'));

console.log(getDaysDiff('10-01-2019', '10-30-2019'));
console.log(getDaysDiff('10-01-2019', '2019-10-30', 'MM-DD-YYYY'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.js"></script>


-1

MVC Mam dwa tekst wejściowy 1: numer dnia 2: próbnik daty i godziny

 @Html.TextBox("HeaderINVID", null, new { @id = "HeaderINVID", @type = "number", @class = "form-control", autocomplete = "off", placeholder = "Day Count " })

  @Html.TextBox("HeaderINVDT", null, new { id = "HeaderINVDT", @class = "form-control format-picker", autocomplete = "off", placeholder = " Date" })

javascipt

obliczyć liczbę od daty użycia

    $("#HeaderINVID").bind("keyup", function (e) {
        var INVID = $("#HeaderINVID").val();
        var date = moment()
            .add(INVID, 'd')
            .toDate(); 
        $("#HeaderINVDT").val(moment(date).format('YYYY-MM-DD')) ;
    })

użyć do obliczenia liczby dni między dwiema datami

  $("#HeaderINVDT").bind('change', function (e) {
        var StDT = moment($("#HeaderINVDT").val()).startOf('day');
        var NODT = moment().startOf('day');
        $("#HeaderINVID").val(StDT.diff(NODT, 'days'));
    })

nie zapomnij dodać http://momentjs.com/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.