summaryrefslogtreecommitdiff
path: root/date-fns/src/differenceInBusinessDays/index.ts
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2021-08-23 16:46:06 -0300
committerSebastian <sebasjm@gmail.com>2021-08-23 16:48:30 -0300
commit38acabfa6089ab8ac469c12b5f55022fb96935e5 (patch)
tree453dbf70000cc5e338b06201af1eaca8343f8f73 /date-fns/src/differenceInBusinessDays/index.ts
parentf26125e039143b92dc0d84e7775f508ab0cdcaa8 (diff)
downloadnode-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.tar.gz
node-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.tar.bz2
node-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.zip
added web vendorsHEADmaster
Diffstat (limited to 'date-fns/src/differenceInBusinessDays/index.ts')
-rw-r--r--date-fns/src/differenceInBusinessDays/index.ts62
1 files changed, 62 insertions, 0 deletions
diff --git a/date-fns/src/differenceInBusinessDays/index.ts b/date-fns/src/differenceInBusinessDays/index.ts
new file mode 100644
index 0000000..46fd575
--- /dev/null
+++ b/date-fns/src/differenceInBusinessDays/index.ts
@@ -0,0 +1,62 @@
+import isValid from '../isValid/index'
+import isWeekend from '../isWeekend/index'
+import toDate from '../toDate/index'
+import differenceInCalendarDays from '../differenceInCalendarDays/index'
+import addDays from '../addDays/index'
+import isSameDay from '../isSameDay/index'
+import toInteger from '../_lib/toInteger/index'
+import requiredArgs from '../_lib/requiredArgs/index'
+
+/**
+ * @name differenceInBusinessDays
+ * @category Day Helpers
+ * @summary Get the number of business days between the given dates.
+ *
+ * @description
+ * Get the number of business day periods between the given dates.
+ * Business days being days that arent in the weekend.
+ * Like `differenceInCalendarDays`, the function removes the times from
+ * the dates before calculating the difference.
+ *
+ * @param {Date|Number} dateLeft - the later date
+ * @param {Date|Number} dateRight - the earlier date
+ * @returns {Number} the number of business days
+ * @throws {TypeError} 2 arguments required
+ *
+ * @example
+ * // How many business days are between
+ * // 10 January 2014 and 20 July 2014?
+ * var result = differenceInBusinessDays(
+ * new Date(2014, 6, 20),
+ * new Date(2014, 0, 10)
+ * )
+ * //=> 136
+ */
+export default function differenceInBusinessDays(
+ dirtyDateLeft: Date | number,
+ dirtyDateRight: Date | number
+): number {
+ requiredArgs(2, arguments)
+
+ const dateLeft = toDate(dirtyDateLeft)
+ let dateRight = toDate(dirtyDateRight)
+
+ if (!isValid(dateLeft) || !isValid(dateRight)) return NaN
+
+ const calendarDifference = differenceInCalendarDays(dateLeft, dateRight)
+ const sign = calendarDifference < 0 ? -1 : 1
+
+ const weeks = toInteger(calendarDifference / 7)
+
+ let result = weeks * 5
+ dateRight = addDays(dateRight, weeks * 7)
+
+ // the loop below will run at most 6 times to account for the remaining days that don't makeup a full week
+ while (!isSameDay(dateLeft, dateRight)) {
+ // sign is used to account for both negative and positive differences
+ result += isWeekend(dateRight) ? 0 : sign
+ dateRight = addDays(dateRight, sign)
+ }
+
+ return result === 0 ? 0 : result
+}