Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Здесь вы идете!
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)
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)
Если вам нужна версия примера кода @ 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/
var increment = days / Math.abs(days);
Это будет всегда 1, не так ли?
– csaiki
22 May 2018 в 17:01
days
отрицательный (т.е. вы хотите уменьшить дни), тогда он будет -1
– dain
23 May 2018 в 19:43
Я знаю, что этот вопрос был опубликован давно, но в случае, если кто-то столкнется с этим, здесь оптимизированное решение, используя 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;
}
Те итерационные петлевые решения не соответствовали моим потребностям. Они были слишком медленными для больших чисел. Поэтому я сделал свою собственную версию:
https://github.com/leonardosantos/momentjs-business
Надеюсь, вы сочтете это полезным.
Я бы предложил добавить функцию прототипу момента.
Что-то вроде этого, может быть? (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;
},
И когда вы закончите и напишите несколько тестов, отправьте запрос на получение бонусных очков.
Если вы хотите использовать чистую версию 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, счетчик не увеличивается, но дата увеличивается. Этот скрипт подходит для небольших дат, например, месяца или менее.
var inc = days / Math.abs(days);
обновил условие while доdays != 0
и изменил вхождения1
вinc
. Таким образом, я могу «добавить» отрицательное количество рабочих дней. – psion5mx 20 March 2014 в 17:18date = date.add(1, 'days');
может быть простоdate.add(1, 'days');
, поскольку экземпляры Moment изменяемы – kartsims 8 February 2017 в 16:19