Как получить разницу календарной недели между двумя моментами? - PullRequest
0 голосов
/ 07 мая 2018

Я хочу получить разницу календарной недели между двумя датами в javascript.

Пример:

a='09-May-2018'
b='14-May-2018'

Разница между этими двумя календарными неделями составляет 2.

Я начал с преобразования даты в момент и получения разницы в неделях методом diff Moment.js. Но это с учетом того, что 7 дней считаются неделями, а для примера - 1.

Я думал о том, как получить номер недели в моменте, а затем вычесть его. Но в том, если дата двух разных лет. Я получу неправильный результат. Как '01-Jan-2017' и '01-Jan-2018' даст номер недели как 1.

Есть ли лучший способ сделать это эффективно?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вы также можете рассчитать разницу в неделях в обычном JavaScript. Поскольку вы не полностью объяснили правила определения количества недель, я сделал несколько предположений. Следующее:

  1. По умолчанию первый день недели - понедельник
  2. Копирует даты и перемещает их в начало недели
  3. Убедитесь, что d0 раньше, чем d1
  4. Рассчитывает количество недель как 1 + (endDate - startDate) / 7
  5. День начала недели можно установить с помощью необязательного третьего параметра: 0 = воскресенье, 1 = понедельник и т. Д.
  6. Результат всегда положительный. Если даты на одной неделе, разница составляет 1.

Это работает правильно, только если дата окончания - после даты начала.

/* Calculate weeks between dates
** Difference is calculated by getting date for start of week,
** getting difference, dividing and rounding, then adding 1.
** @param {Date} d0 - date for start
** @param {Date} d1 - date for end
** @param {number} [startDay] - default is 1 (Monday)
** @returns {number} weeks between dates, always positive
*/
function weeksBetweenDates(d0, d1, startDay) {

  // Default start day to 1 (Monday)
  if (typeof startDay != 'number') startDay = 1;

  // Copy dates so don't affect originals
  d0 = new Date(d0);
  d1 = new Date(d1);

  // Set dates to the start of the week based on startDay
  [d0, d1].forEach(d => d.setDate(d.getDate() + ((startDay - d.getDay() - 7) % 7)));

  // If d1 is before d0, swap them
  if (d1 < d0) {
    var t = d1;
    d1 = d0;
    d0 = t;
  }

  return Math.round((d1 - d0)/6.048e8) + 1;
}

console.log(weeksBetweenDates(new Date(2018, 4, 9), new Date(2018, 4, 14)));
0 голосов
/ 07 мая 2018

У меня было требование, что если разница больше 12 недель, я должен выполнить какое-то действие. Поэтому я сделал это, используя метод Moment неделя за неделей (). Как это:

Math.abs(endDate.diff(startDate, 'days'))<91 &&
  Math.abs(startDate.week() - endDate.week()) < 12) 
0 голосов
/ 07 мая 2018

Получите начальный день недели и найдите разницу в неделе, используя b1.diff(a1,'week');

function getWeekDiff(day1,day2){
 var a1 = moment(day1, "DD-MMM-YYYY").startOf('week');
 var b1 = moment(day2, "DD-MMM-YYYY").startOf('week');
 var weekDiff = b1.diff(a1,'week');
 console.log(weekDiff);
 return weekDiff;
}

getWeekDiff("09-May-2018", "14-May-2018");
getWeekDiff("01-Jan-2017", "01-Jan-2018");
getWeekDiff("08-May-2018", "08-May-2018");
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.js"></script>
...