UNPKG

3.98 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = getOverlappingDaysInIntervals;
7
8var _index = _interopRequireDefault(require("../toDate/index.js"));
9
10var _index2 = _interopRequireDefault(require("../_lib/requiredArgs/index.js"));
11
12function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
14var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
15/**
16 * @name getOverlappingDaysInIntervals
17 * @category Interval Helpers
18 * @summary Get the number of days that overlap in two time intervals
19 *
20 * @description
21 * Get the number of days that overlap in two time intervals
22 *
23 * ### v2.0.0 breaking changes:
24 *
25 * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).
26 *
27 * - The function was renamed from `getOverlappingDaysInRanges` to `getOverlappingDaysInIntervals`.
28 * This change was made to mirror the use of the word "interval" in standard ISO 8601:2004 terminology:
29 *
30 * ```
31 * 2.1.3
32 * time interval
33 * part of the time axis limited by two instants
34 * ```
35 *
36 * Also, this function now accepts an object with `start` and `end` properties
37 * instead of two arguments as an interval.
38 * This function now throws `RangeError` if the start of the interval is after its end
39 * or if any date in the interval is `Invalid Date`.
40 *
41 * ```javascript
42 * // Before v2.0.0
43 *
44 * getOverlappingDaysInRanges(
45 * new Date(2014, 0, 10), new Date(2014, 0, 20),
46 * new Date(2014, 0, 17), new Date(2014, 0, 21)
47 * )
48 *
49 * // v2.0.0 onward
50 *
51 * getOverlappingDaysInIntervals(
52 * { start: new Date(2014, 0, 10), end: new Date(2014, 0, 20) },
53 * { start: new Date(2014, 0, 17), end: new Date(2014, 0, 21) }
54 * )
55 * ```
56 *
57 * @param {Interval} intervalLeft - the first interval to compare. See [Interval]{@link docs/Interval}
58 * @param {Interval} intervalRight - the second interval to compare. See [Interval]{@link docs/Interval}
59 * @returns {Number} the number of days that overlap in two time intervals
60 * @throws {TypeError} 2 arguments required
61 * @throws {RangeError} The start of an interval cannot be after its end
62 * @throws {RangeError} Date in interval cannot be `Invalid Date`
63 *
64 * @example
65 * // For overlapping time intervals adds 1 for each started overlapping day:
66 * getOverlappingDaysInIntervals(
67 * { start: new Date(2014, 0, 10), end: new Date(2014, 0, 20) },
68 * { start: new Date(2014, 0, 17), end: new Date(2014, 0, 21) }
69 * )
70 * //=> 3
71 *
72 * @example
73 * // For non-overlapping time intervals returns 0:
74 * getOverlappingDaysInIntervals(
75 * { start: new Date(2014, 0, 10), end: new Date(2014, 0, 20) },
76 * { start: new Date(2014, 0, 21), end: new Date(2014, 0, 22) }
77 * )
78 * //=> 0
79 */
80
81function getOverlappingDaysInIntervals(dirtyIntervalLeft, dirtyIntervalRight) {
82 (0, _index2.default)(2, arguments);
83 var intervalLeft = dirtyIntervalLeft || {};
84 var intervalRight = dirtyIntervalRight || {};
85 var leftStartTime = (0, _index.default)(intervalLeft.start).getTime();
86 var leftEndTime = (0, _index.default)(intervalLeft.end).getTime();
87 var rightStartTime = (0, _index.default)(intervalRight.start).getTime();
88 var rightEndTime = (0, _index.default)(intervalRight.end).getTime(); // Throw an exception if start date is after end date or if any date is `Invalid Date`
89
90 if (!(leftStartTime <= leftEndTime && rightStartTime <= rightEndTime)) {
91 throw new RangeError('Invalid interval');
92 }
93
94 var isOverlapping = leftStartTime < rightEndTime && rightStartTime < leftEndTime;
95
96 if (!isOverlapping) {
97 return 0;
98 }
99
100 var overlapStartDate = rightStartTime < leftStartTime ? leftStartTime : rightStartTime;
101 var overlapEndDate = rightEndTime > leftEndTime ? leftEndTime : rightEndTime;
102 var differenceInMs = overlapEndDate - overlapStartDate;
103 return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY);
104}
105
106module.exports = exports.default;
\No newline at end of file