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

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

25
задан Pranav C Balan 26 December 2013 в 19:10
поделиться

8 ответов

Здесь вы идете!

function addWeekdays(date, days) {
  date = moment(date); // use a clone
  while (days > 0) {
    date = date.add(1, 'days');
    // decrease "days" only if it's a weekday.
    if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
      days -= 1;
    }
  }
  return date;
}

Вы вызываете это так

var date = addWeekdays(moment(), 5);

Я использовал .isoWeekday вместо .weekday, потому что он не зависит от locale (.weekday(0) может быть как в понедельник, так и в воскресенье).

Не вычитайте дни недели, т. е. addWeekdays(moment(), -3), иначе эта простая функция будет зацикливаться навсегда!

Обновлен JSFiddle http://jsfiddle.net/Xt2e6/39/ (используя разные импульсы cdn)

42
ответ дан andersoyvind 18 August 2018 в 20:00
поделиться
  • 1
    Ницца. Теперь я использую версию этого. Но я изменил с помощью: var inc = days / Math.abs(days); обновил условие while до days != 0 и изменил вхождения 1 в inc. Таким образом, я могу «добавить» отрицательное количество рабочих дней. – psion5mx 20 March 2014 в 17:18
  • 2
    Проблема в том, что он использует цикл, поэтому он не будет масштабироваться – John Wheeler 9 August 2014 в 17:40
  • 3
    Умное использование цикла while – Peter 31 August 2015 в 07:46
  • 4
    Хороший сниппет, спасибо! Но date = date.add(1, 'days'); может быть просто date.add(1, 'days');, поскольку экземпляры Moment изменяемы – kartsims 8 February 2017 в 16:19

https://github.com/andruhon/moment-weekday-calc плагин для momentJS может быть полезен для подобных задач

Он не решает точной проблемы, но он может вычислять конкретные дни недели в диапазоне.

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

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)
10
ответ дан Andrew Kondratev 18 August 2018 в 20:00
поделиться

Если вам нужна версия примера кода @ acorio, которая является результативной (с использованием оптимизации @ Isantos) и может иметь дело с отрицательными числами, используйте это:

moment.fn.addWorkdays = function (days) {
  var increment = days / Math.abs(days);
  var date = this.clone().add(Math.floor(Math.abs(days) / 5) * 7 * increment, 'days');
  var remaining = days % 5;
  while(remaining != 0) {
    date.add(increment, 'days');
    if(date.isoWeekday() !== 6 && date.isoWeekday() !== 7)
      remaining -= increment;
  }
  return date;
};

См. здесь Fiddle: http: //jsfiddle.net/dain/5xrr79h0/

4
ответ дан dain 18 August 2018 в 20:00
поделиться
  • 1
    Привет @dain Я не понял этого var increment = days / Math.abs(days); Это будет всегда 1, не так ли? – csaiki 22 May 2018 в 17:01
  • 2
    @csaiki no, в случае, если days отрицательный (т.е. вы хотите уменьшить дни), тогда он будет -1 – dain 23 May 2018 в 19:43
  • 3
    имеет смысл! Спасибо =) – csaiki 23 May 2018 в 20:08

Я знаю, что этот вопрос был опубликован давно, но в случае, если кто-то столкнется с этим, здесь оптимизированное решение, используя moment.js:

function getBusinessDays(startDate, endDate){
  var startDateMoment = moment(startDate);
  var endDateMoment = moment(endDate)
  var days = Math.round(startDateMoment.diff(endDateMoment, 'days') - startDateMoment .diff(endDateMoment, 'days') / 7 * 2);
  if (endDateMoment.day() === 6) {
    days--;
  }
  if (startDateMoment.day() === 7) {
    days--;
  }
  return days;
}
4
ответ дан ingbabic 18 August 2018 в 20:00
поделиться

Те итерационные петлевые решения не соответствовали моим потребностям. Они были слишком медленными для больших чисел. Поэтому я сделал свою собственную версию:

https://github.com/leonardosantos/momentjs-business

Надеюсь, вы сочтете это полезным.

19
ответ дан lsantos 18 August 2018 в 20:00
поделиться

Я бы предложил добавить функцию прототипу момента.

Что-то вроде этого, может быть? (untested)

    nextWeekday : function () {
        var day = this.clone(this);
        day = day.add('days', 1);
        while(day.weekday() == 0 || day.weekday() == 6){
          day = day.add("days", 1);              
        }
        return day;
    },
    nthWeekday : function (n) {
        var day = this.clone(this);
        for (var i=0;i<n;i++) {
          day = day.nextWeekday();
        }
        return day;
    },

И когда вы закончите и напишите несколько тестов, отправьте запрос на получение бонусных очков.

3
ответ дан MobileDream 18 August 2018 в 20:00
поделиться

Если вы хотите использовать чистую версию JavaScript (не полагаясь на Moment.js), попробуйте это ...

function addWeekdays(date, days) {
    date.setDate(date.getDate());
    var counter = 0;
        if(days > 0 ){
            while (counter < days) {
                date.setDate(date.getDate() + 1 ); // Add a day to get the date tomorrow
                var check = date.getDay(); // turns the date into a number (0 to 6)
                    if (check == 0 || check == 6) {
                        // Do nothing it's the weekend (0=Sun & 6=Sat)
                    }
                    else{
                        counter++;  // It's a weekday so increase the counter
                    }
            }
        }
    return date;
}

Вы вызываете это так:

var date = addWeekdays(new Date(), 3);

Эта функция проверяет каждый следующий день, чтобы узнать, выпадает ли она в субботу (6 день) или в воскресенье (день 0). Если значение true, счетчик не увеличивается, но дата увеличивается. Этот скрипт подходит для небольших дат, например, месяца или менее.

1
ответ дан Tremours 18 August 2018 в 20:00
поделиться
0
ответ дан Puzzo 30 October 2018 в 08:18
поделиться
Другие вопросы по тегам:

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