From 8d7c6300a748674251c67c600b0423a6255ee810 Mon Sep 17 00:00:00 2001 From: Kristjan Pihus Date: Thu, 18 May 2017 15:51:21 +0300 Subject: [PATCH 1/2] businessDiff bugfix --- README.md | 9 ++ index.js | 305 +++++++++++++++++++++++++++----------------------- tests/test.js | 17 ++- 3 files changed, 187 insertions(+), 144 deletions(-) diff --git a/README.md b/README.md index 6d3064f..2e95132 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,15 @@ moment.locale('us', { ### Methods: +**businessDiff(date)** + +Will calculate number of business days between dates. +````javascript +var diff = moment('05-01-2017').businessDiff(moment('2017-05-31 00:00:00')) +// businessDiff paremeter must be an moment object. + +```` + **businessAdd(days)** Will add just business days excluding Saturday and Sunday, return a moment date object: diff --git a/index.js b/index.js index 84f8b6f..d7b5bc4 100644 --- a/index.js +++ b/index.js @@ -2,179 +2,202 @@ var moment = require('moment'); moment.fn.isHoliday = function () { - var locale = this.localeData(); + var locale = this.localeData(); - if (locale._holidays) { - if (locale._holidays.indexOf(this.format(locale._holidayFormat)) >= 0) return true; - } + if (locale._holidays) { + if (locale._holidays.indexOf(this.format(locale._holidayFormat)) >= 0) return true; + } - return false; + return false; }; -moment.fn.isBusinessDay = function() { - var locale = this.localeData(); - var defaultWorkingWeekdays = [1,2,3,4,5]; - var workingWeekdays = locale._workingWeekdays || defaultWorkingWeekdays; +moment.fn.isBusinessDay = function () { + var locale = this.localeData(); + var defaultWorkingWeekdays = [1, 2, 3, 4, 5]; + var workingWeekdays = locale._workingWeekdays || defaultWorkingWeekdays; - if (this.isHoliday()) return false; - if (workingWeekdays.indexOf(this.day())>=0) return true; + if (this.isHoliday()) return false; + if (workingWeekdays.indexOf(this.day()) >= 0) return true; - return false; + return false; }; moment.fn.businessDaysIntoMonth = function () { - var businessDay = this.isBusinessDay() ? this : this.prevBusinessDay(); - var monthBusinessDays = businessDay.monthBusinessDays(); - var businessDaysIntoMonth; - monthBusinessDays.map(function (day, index) { - if (day.format('M/DD/YY') === businessDay.format('M/DD/YY')) - businessDaysIntoMonth = index + 1; - }); - - return businessDaysIntoMonth; + var businessDay = this.isBusinessDay() ? this : this.prevBusinessDay(); + var monthBusinessDays = businessDay.monthBusinessDays(); + var businessDaysIntoMonth; + monthBusinessDays.map(function (day, index) { + if (day.format('M/DD/YY') === businessDay.format('M/DD/YY')) + businessDaysIntoMonth = index + 1; + }); + + return businessDaysIntoMonth; }; -moment.fn.businessDiff = function(param) { - var end = this.clone(); - var start = moment(param); - var daysBetween = 0; +moment.fn.businessDiff = function (param) { + var d1 = this.clone(); + var d2 = param.clone(); + var start = d1 < d2 ? d1 : d2; + var end = d2 > d1 ? d2 : d1; - if(start === end){ - return daysBetween; - } + var daysBetween = 0; + + if (start === end) { + return daysBetween; + } - while (start < end){ - if(this.isBusinessDay(start)){ - daysBetween++; - } - start = start.businessAdd(1) + while (start < end) { + if (start.isBusinessDay()) { + daysBetween++; } + start.add(1, 'd') + } - return daysBetween; + return daysBetween; }; -moment.fn.businessAdd = function(days) { - var signal = days < 0 ? -1 : 1; - var daysRemaining = Math.abs(days); - var d = this.clone(); - while (daysRemaining) { - d.add(signal, 'd'); - if (d.isBusinessDay()) { - daysRemaining--; - }; - }; - return d; +moment.fn.businessAdd = function (days) { + var signal = days < 0 ? -1 : 1; + var daysRemaining = Math.abs(days); + var d = this.clone(); + while (daysRemaining) { + d.add(signal, 'd'); + if (d.isBusinessDay()) { + daysRemaining--; + } + ; + } + ; + return d; }; -moment.fn.businessSubtract = function(days) { - return this.businessAdd(-days); +moment.fn.businessSubtract = function (days) { + return this.businessAdd(-days); }; -moment.fn.nextBusinessDay = function() { - var loop = 1; - var limit = 7; - while (loop < limit) { - if (this.add(1, 'd').isBusinessDay()) { - break; - }; - loop++; - }; - return this; +moment.fn.nextBusinessDay = function () { + var loop = 1; + var limit = 7; + while (loop < limit) { + if (this.add(1, 'd').isBusinessDay()) { + break; + } + ; + loop++; + } + ; + return this; }; -moment.fn.prevBusinessDay = function() { - var loop = 1; - var limit = 7; - while (loop < limit) { - if (this.subtract(1, 'd').isBusinessDay()) { - break; - }; - loop++; - }; - return this; +moment.fn.prevBusinessDay = function () { + var loop = 1; + var limit = 7; + while (loop < limit) { + if (this.subtract(1, 'd').isBusinessDay()) { + break; + } + ; + loop++; + } + ; + return this; }; -moment.fn.monthBusinessDays = function() { - var me = this.clone(); - var day = me.clone().startOf('month'); - var end = me.clone().endOf('month'); - var daysArr = []; - var done = false; - while (!done) { - if (day.isBusinessDay()) { - daysArr.push(day.clone()); - }; - if(end.diff(day.add(1,'d')) < 0) { - done = true; - }; - }; - return daysArr; +moment.fn.monthBusinessDays = function () { + var me = this.clone(); + var day = me.clone().startOf('month'); + var end = me.clone().endOf('month'); + var daysArr = []; + var done = false; + while (!done) { + if (day.isBusinessDay()) { + daysArr.push(day.clone()); + } + ; + if (end.diff(day.add(1, 'd')) < 0) { + done = true; + } + ; + } + ; + return daysArr; }; -moment.fn.monthNaturalDays = function(fromToday) { - var me = this.clone(); - var day = fromToday ? me.clone() : me.clone().startOf('month'); - var end = me.clone().endOf('month'); - var daysArr = []; - var done = false; - while (!done) { - daysArr.push(day.clone()); - if(end.diff(day.add(1,'d')) < 0) { - done = true; - }; - }; - return daysArr; +moment.fn.monthNaturalDays = function (fromToday) { + var me = this.clone(); + var day = fromToday ? me.clone() : me.clone().startOf('month'); + var end = me.clone().endOf('month'); + var daysArr = []; + var done = false; + while (!done) { + daysArr.push(day.clone()); + if (end.diff(day.add(1, 'd')) < 0) { + done = true; + } + ; + } + ; + return daysArr; }; -moment.fn.monthBusinessWeeks = function(fromToday) { - var me = this.clone(); - var day = fromToday ? me.clone() : me.clone().startOf('month'); - var end = me.clone().endOf('month'); - var weeksArr = []; - var daysArr = []; - var done = false; - - while(!done) { - if(day.day() >= 1 && day.day() < 6) { - daysArr.push(day.clone()); - }; - if(day.day() === 5) { - weeksArr.push(daysArr); - daysArr = []; - }; - if(end.diff(day.add(1,'d')) < 0) { - if(daysArr.length < 5) { - weeksArr.push(daysArr); - }; - done = true; - }; - }; - return weeksArr; +moment.fn.monthBusinessWeeks = function (fromToday) { + var me = this.clone(); + var day = fromToday ? me.clone() : me.clone().startOf('month'); + var end = me.clone().endOf('month'); + var weeksArr = []; + var daysArr = []; + var done = false; + + while (!done) { + if (day.day() >= 1 && day.day() < 6) { + daysArr.push(day.clone()); + } + ; + if (day.day() === 5) { + weeksArr.push(daysArr); + daysArr = []; + } + ; + if (end.diff(day.add(1, 'd')) < 0) { + if (daysArr.length < 5) { + weeksArr.push(daysArr); + } + ; + done = true; + } + ; + } + ; + return weeksArr; }; -moment.fn.monthNaturalWeeks = function(fromToday) { - var me = this.clone(); - var day = fromToday ? me.clone() : me.clone().startOf('month'); - var end = me.clone().endOf('month'); - var weeksArr = []; - var daysArr = []; - var done = false; - - while(!done) { - daysArr.push(day.clone()); - if(day.day() === 6) { - weeksArr.push(daysArr); - daysArr = []; - }; - if(end.diff(day.add(1,'d')) < 0) { - if(daysArr.length < 7) { - weeksArr.push(daysArr); - }; - done = true; - }; - }; - return weeksArr; +moment.fn.monthNaturalWeeks = function (fromToday) { + var me = this.clone(); + var day = fromToday ? me.clone() : me.clone().startOf('month'); + var end = me.clone().endOf('month'); + var weeksArr = []; + var daysArr = []; + var done = false; + + while (!done) { + daysArr.push(day.clone()); + if (day.day() === 6) { + weeksArr.push(daysArr); + daysArr = []; + } + ; + if (end.diff(day.add(1, 'd')) < 0) { + if (daysArr.length < 7) { + weeksArr.push(daysArr); + } + ; + done = true; + } + ; + } + ; + return weeksArr; }; module.exports = moment; diff --git a/tests/test.js b/tests/test.js index e2932e2..119731b 100644 --- a/tests/test.js +++ b/tests/test.js @@ -133,8 +133,12 @@ describe('Moment Business Days', function () { describe('Business Diff', function(){ afterEach(resetLocale) it('Should calculate number of busines days between dates', function(){ - var diff = moment('05-15-2017', 'MM-DD-YYYY').businessDiff(moment('05-08-2017')) - expect(diff).to.eql(5) + var diff = moment('05-31-2017', 'MM-DD-YYYY').businessDiff(moment('05-01-2017', 'MM-DD-YYYY')) + expect(diff).to.eql(22) + }); + it('... and in reverse order ', function(){ + var diff = moment('05-01-2017').businessDiff(moment('2017-05-31 00:00:00')) + expect(diff).to.eql(22) }); it('Should calculate nr of business days with custom workingdays', function(){ moment.locale('us',{ @@ -142,7 +146,14 @@ describe('Moment Business Days', function () { }); var diff = moment('05-15-2017', 'MM-DD-YYYY').businessDiff(moment('05-08-2017')) expect(diff).to.eql(6) - }) + }); + it('Should calculate nr of business with all working days', function(){ + moment.locale('us',{ + workingWeekdays: [0,1,2,3,4,5,6] + }); + var diff = moment('06-18-2017', 'MM-DD-YYYY').businessDiff(moment('05-18-2017')) + expect(diff).to.eql(31) + }); it('Should be zero days if start and end is same', function(){ var diff = moment('05-08-2017', 'MM-DD-YYYY').businessDiff(moment('05-08-2017')); From 766d69eb430747031949cda569c9a3ede9461af8 Mon Sep 17 00:00:00 2001 From: Kristjan Pihus Date: Thu, 18 May 2017 16:12:35 +0300 Subject: [PATCH 2/2] Merge branches 'kpihus/bug/isBusinesDay' and 'master' of https://github.com/kpihus/moment-business-days into kpihus/bug/isBusinesDay # Conflicts: # index.js # tests/test.js --- README.md | 8 -------- tests/test.js | 4 ++++ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 554567b..8de4da0 100644 --- a/README.md +++ b/README.md @@ -51,14 +51,6 @@ moment.locale('us', { ### Methods: -**businessDiff(date)** - -Will calculate number of business days between dates. -````javascript -var diff = moment('05-01-2017').businessDiff(moment('2017-05-31 00:00:00')) -// businessDiff paremeter must be an moment object. - -```` **businessAdd(days)** diff --git a/tests/test.js b/tests/test.js index 98e45b2..136cb4f 100644 --- a/tests/test.js +++ b/tests/test.js @@ -171,6 +171,10 @@ describe('Moment Business Days', function () { var diff = moment('05-15-2017', 'MM-DD-YYYY').businessDiff(moment('05-08-2017','MM-DD-YYYY')) expect(diff).to.eql(5) }); + it('...and in reverse order', function(){ + var diff = moment('05-08-2017', 'MM-DD-YYYY').businessDiff(moment('05-15-2017','MM-DD-YYYY')) + expect(diff).to.eql(5) + }); it('Should calculate nr of business days with custom workingdays', function(){ moment.updateLocale('us',{ workingWeekdays: [1,2,3,4,5,6]