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

У меня есть две даты ввода, начиная с элемента управления выбора даты. Я выбрал дату начала 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);
}

Может ли кто-нибудь сказать мне, как я могу получить точную разницу?

Ответ 1

http://momentjs.com/ или https://date-fns.org/ p >

Из Moment docs:

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

или включить начало:

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

Удаляет беспорядок с метками времени и часовыми поясами вручную.

В зависимости от вашего конкретного варианта использования вы можете

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

Ответ 2

Если вы используете 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();

Если вы хотите найти разницу между заданной датой и текущей датой в количестве дней (игнорируя время), обязательно удалите объект time из момента текущей даты, как показано ниже

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

Ответ 3

Try:

//Difference in days

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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