Як обчислити кількість днів між двома датами


282

У мене є дві дати введення, що приймаються від контролю вибору дати. Я вибрав дату початку 2.02.2012 і кінцеву дату 2/7/2012. Я написав наступний код для цього.

Я повинен отримати результат як 6, але я отримую 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);
}

Хто-небудь може сказати мені, як я можу отримати точну різницю?


чому ти повинен отримати результат = 6 ??? 07 - 02 = 05 день ....
Андре Алькада Падес

1
Але діапазон днів від 2 до 7 становить 2,3,4,5,6,7 = 6 днів.
Супр

Вважаючи різницю, я хочу також розглянути дату початку ....
Вайбхав Дешмух,

17
Ну ... чому б просто не додати 1 до відповіді?
Pointy

Питання (якщо воно взагалі є) функціональне, а не технічне. @Pointy коментар відповідь. Ось чому деякі запитують, чому ми в XXI столітті.
Леандро

Відповіді:


666

http://momentjs.com/ або https://date-fns.org/

З Документів Моменту:

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

або включити початок:

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

Б'є возитися з часовими позначками та часовими поясами вручну.

Залежно від конкретного випадку використання, ви можете будь-який

  1. Використовуйте a/b.startOf('day')та / або a/b.endOf('day')змушуйте різницю бути включною або ексклюзивною на "кінцях" (як запропонував @kotpal у коментарях).
  2. Встановити третій аргумент , trueщоб отримати точку диф плаваючу , який ви можете Math.floor, Math.ceilабо по Math.roundмірі необхідності.
  3. Варіант 2 також може бути виконаний шляхом отримання 'seconds'замість, 'days'а потім ділення на 24*60*60.

30
moment.js дасть негативне значення, якщо a <b. Отже, більш надійний розрахунок був би: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni

18
Не забудьте проігнорувати часову частину - інакше ви отримаєте різні результати за одну і ту ж дату, але в різний час (наприклад, від контролю вибору дат). використовувати момент (someDate) .startOf ('day'), щоб явно встановити часову частину на 00:00:00 перед виконанням diff (або будь-яких інших операцій, чутливих до часової частини об'єкта Date / moment)
kotpal

Це працює, але не враховує часовий компонент. Намагаючись розрізнити дві наступні пари: (a = "2017-12-24T00: 00: 00Z" та "b = 2017-12-31T23: 59: 59Z") та (a = "2017-12-24T23: 00 : 00Z "і b =" 2017-12-31T23: 59: 59Z "). повернути b.diff (a, 'дні') <= 7; обидва повертаються правдою. Чи є спосіб включити часову складову в різницю?
Робі

1
+1 для startOf () та endOf (). Я користувався цією бібліотекою кілька років і ніколи раніше не помічав їх. Я завжди робив +1.
Майк Девенні

3
Будьте в курсі, що startOfмутує момент. Якщо ви цього не хочете, то робіть a.clone().startOf('day').diff(b.clone().startOf('day')).
HRJ

53

Якщо ви використовуєте moment.js, ви можете це зробити легко.

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();

Якщо ви хочете знайти різницю між заданою датою та поточною датою в кількості днів (ігноруючи час), не забудьте видалити час з об'єкта моменту поточної дати, як показано нижче

moment().startOf('day')

Щоб знайти різницю між заданою датою і поточною датою в кількості днів

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 () повернув мені деякі значення десятковою комою. Я використовую current.diff(given, 'days')так, що він округляється.
Вінсент

@Вінсенту здається, що ти використовуєш це неправильно. це, безумовно, більш чисте рішення, результат правильний порівняно з відповіддю @Supr, в якій 1втрачено a
Nwawel A Iroume

15

Спробуйте:

//Difference in days

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

Я думаю, що це в основному правильно, але хіба це не те саме, що в ОП?
Pointy

Через те, як він це написав, я не помітив, але так, досить! : P
Річард

5
Мені не подобаються магічні цифри . Було б краще, якби це число було розбито на
самовияснене

7

Спробуйте це, використовуючи moment.js (Це досить просто для обчислення операцій з датою в JavaScript)

firstDate.diff (secondDate, 'дні', помилка); // true | значення для значення дробу

Результат дасть вам цілу кількість днів.


ось підпис: moment (). diff (Момент | String | Номер | Дата | Масив, String, Boolean);
Суміт

1

Також ви можете використовувати цей код: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Це дозволить обчислити різницю між сьогоднішньою та вказаною вами датою.



1

Я зробив швидку функцію повторного використання в ES6 за допомогою 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 У мене є два вхідні тексти 1: число 2 дня: вибір часу вибору дати

 @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

обчислити число від використання дати

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

обчислити кількість днів між двома датами використання

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

не забудьте додати http://momentjs.com/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.