Подсчитайте выходные дни между двумя датами. используя Moment.js [дубликат]

Один из способов получить эту ошибку в Eclipse:

  1. Определить класс A в src/test/java.
  2. Определить другой класс B в src/main/java который использует класс A.

Результат: Eclipse будет компилировать код, но maven предоставит «Невозможно найти символ».

Основная причина: Eclipse использует комбинированный путь сборки для основного и тестового деревьев. К сожалению, он не поддерживает использование разных путей сборки для разных частей проекта Eclipse, чего требует Maven.

Решение:

  1. Не определяйте свои зависимости, которые путь; то есть не делайте эту ошибку.
  2. Регулярно создавайте свою кодовую базу с помощью Maven, чтобы вы заранее поняли эту ошибку. Один из способов сделать это - использовать CI-сервер.
2
задан Dan G Nelson 17 March 2015 в 04:34
поделиться

4 ответа

Я придумал следующую функцию, которая, кажется, работает для данной кучи тестовых примеров, которые я пробовал:

function weekdaysBetween(d1, d2, isoWeekday) {
    // ensure we have valid moment instances
    d1 = moment(d1);
    d2 = moment(d2);
    // figure out how many days to advance to get to the next
    // specified weekday (might be 0 if d1 is already the 
    // specified weekday).
    var daysToAdd = ((7 + isoWeekday) - d1.isoWeekday()) % 7;
    var nextTuesday = d1.clone().add(daysToAdd, 'days');
    // if we are already passed the end date, there must not
    // be any of that day in the given period.
    if (nextTuesday.isAfter(d2)) {
        return 0;
    }
    // otherwise, just return the whole number of weeks
    // difference plus one for the day we already advanced to
    var weeksBetween = d2.diff(nextTuesday, 'weeks');
    return weeksBetween + 1;
}

Вы передаете значение isoWeekday для в тот день, когда вы пытаетесь подсчитать. например во вторник перейдите в 2.

Образец вызова:

var d1 = moment('2015-03-01');
var d2 = moment('2015-03-25');

console.log('result:', weekdaysBetween(d1, d2, 2)); // => result: 4

Wolfram Alpha дает тот же результат .

Вы должны добавить свои собственные тесты, прежде чем доверять этому полностью.

5
ответ дан Petr Bela 18 August 2018 в 17:49
поделиться
  • 1
    Я изменил и немного расширил этот список, включив его (например, диапазон с понедельника, 01 января 2018 года и в тот же понедельник, вернется 1 по понедельникам). Я также написал некоторые базовые тесты (для Jest / Jasmine) - в случае, если это полезно для кого-то, см. этот gist . – Max 5 July 2018 в 14:17

https://github.com/andruhon/moment-weekday-calc делает то, что вам нужно. Он вычисляет определенные дни недели в диапазоне, с возможностью исключения конкретных дней (например, праздничные дни)

Использование:

moment().isoWeekdayCalc({  
  rangeStart: '1 Apr 2015',  
  rangeEnd: '31 Mar 2016',  
  weekdays: [1,2,3,4,5], //weekdays Mon to Fri
  exclusions: ['6 Apr 2015','7 Apr 2015']  //public holidays
}) //returns 260 (260 workdays excluding two public holidays)
1
ответ дан Andrew Kondratev 18 August 2018 в 17:49
поделиться

Если вы пытаетесь найти количество будних дней W (например, понедельник, вторник и hellip;) между двумя датами N и M , вы можете:

  1. Найти следующее происшествие N ' из W после N .
  2. Найдите количество дней между N ' и M .
  3. Если N' после M , между ними нет W . В противном случае количество дней W должно быть равно 1 + floor ((M-N) / 7) .
function getWeekdaysBetweenDates(firstDate, secondDate, dayOfWeek) {
    var MILISECONDS_IN_DAY = 86400000;

    function getNextDayOfWeek(date, dayOfWeek) {
        date.setDate(date.getDate() + (7 + dayOfWeek - date.getDay()) % 7);
        return date;
    }

    firstDate = getNextDayOfWeek(firstDate, dayOfWeek);
    if (firstDate > secondDate) {
        return 0;
    }

    return 1 + Math.floor(((secondDate - firstDate) / MILISECONDS_IN_DAY) / 7);
}

var firstDate = new Date("March 1, 2015");
var secondDate = new Date("March 25, 2015");
console.log(getWeekdaysBetweenDates(firstDate, secondDate, 2));
// 4
3
ответ дан kba 18 August 2018 в 17:49
поделиться
  • 1
    Это ванильная версия JS кода, который я опубликовал, который использовал эквивалентные методы MomentJS. Хорошо, чтобы проверить мой алгоритм. – GregL 17 March 2015 в 05:07

, если вы похожи на меня с умом, который запутывается по математике:

var startDate = moment().startOf('month');
var endDate = moment().endOf('month');

var aDate = moment(startDate).day('Sunday');

var weekDays = 0;
while (aDate.isSameOrBefore(endDate)) {
   if (aDate.isSameOrAfter(startDate) && aDate.isSameOrBefore(endDate))
        weekDays++;
   aWeekDayDate.add(1, 'week');
}
0
ответ дан vinjenzo 18 August 2018 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: