Как рассчитать количество дней между двумя датами

284

У меня есть две даты ввода, взятые из элемента управления выбора даты. Я выбрал дату начала 2/2/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 дней.
Supr
Принимая во внимание разницу, я хочу также рассмотреть дату начала ....
Вайбхав Дешмукх
17
Ну ... почему бы просто не добавить 1 к ответу?
Заостренный
Проблема (если она вообще есть) является функциональной, а не технической. @Pointy комментарий является ответом. Вот почему некоторые люди спрашивают, почему мы в XXI веке.
Леандро

Ответы:

668

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')чтобы заставить diff быть включающим или исключающим на «концах» (как предложено @kotpal в комментариях).
  2. Установить третий аргумент , trueчтобы получить точку диф плавающую , который вы можете Math.floor, Math.ceilили по Math.roundмере необходимости.
  3. Вариант 2 также может быть выполнен путем получения 'seconds'вместо, 'days'а затем деления на 24*60*60.
Supr
источник
30
момент.js даст отрицательное значение, если a <b. Итак, более надежный расчет будет: Math.abs(a.diff(b, 'days'))+1
Vinay Sahni
18
Помните, что нужно игнорировать часть времени - иначе вы получите разные результаты для одной и той же даты, но с разным временем (например, из элемента управления выбора даты). использовать момент (someDate) .startOf ('день'), чтобы явно установить временную часть на 00:00:00 перед выполнением различий (или любых других операций, чувствительных к временной части объекта Дата / момент)
kotpal
Это работает, но не учитывает временную составляющую. Попытка различить следующие две пары: (a = "2017-12-24T23: 59: 59Z" и "b = 2017-12-24T23: 00" и "b = 2017-12-31T23") и (a = "2017-12-24T23: 00 : 00Z "и b =" 2017-12-31T23: 59: 59Z "). return b.diff (a, 'days') <= 7; оба возвращают истину. Есть ли способ включить компонент времени в diff?
Roobie
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);
Ричард
источник
Я думаю, что это в принципе правильно, но разве это не то же самое, что в ОП?
Заостренный
Из-за того, как он написал это, я не заметил, но да, в значительной степени! : P
Ричард
5
Я не люблю магические числа .. было бы лучше, если бы это число было разбито на самоочевидное уравнение
vsync
7

Попробуйте это с помощью moment.js (довольно просто вычислить операции с датой в javascript)

firstDate.diff (secondDate, 'days', false);// true | false для значения дроби

Результат даст вам количество дней в целых числах.

Sumit
источник
вот подпись: moment (). diff (Moment | String | Number | Date | Array, String, Boolean);
Саммит
1

Также вы можете использовать этот код: moment ("yourDateHere", "YYYY-MM-DD"). FromNow (). Это вычислит разницу между сегодняшним днем ​​и предоставленной вами датой.

Дэвид
источник
1

Это работает для меня:

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

Я сделал быструю функцию многократного использования в 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/

Aladein
источник