var parse = require('../parse/index.js') var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000 /** * @category Range Helpers * @summary Get the number of days that overlap in two date ranges * * @description * Get the number of days that overlap in two date ranges * * @param {Date|String|Number} initialRangeStartDate - the start of the initial range * @param {Date|String|Number} initialRangeEndDate - the end of the initial range * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with * @returns {Number} the number of days that overlap in two date ranges * @throws {Error} startDate of a date range cannot be after its endDate * * @example * // For overlapping date ranges adds 1 for each started overlapping day: * getOverlappingDaysInRanges( * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) * ) * //=> 3 * * @example * // For non-overlapping date ranges returns 0: * getOverlappingDaysInRanges( * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) * ) * //=> 0 */ function getOverlappingDaysInRanges (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { throw new Error('The start of the range cannot be after the end of the range') } var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime if (!isOverlapping) { return 0 } var overlapStartDate = comparedStartTime < initialStartTime ? initialStartTime : comparedStartTime var overlapEndDate = comparedEndTime > initialEndTime ? initialEndTime : comparedEndTime var differenceInMs = overlapEndDate - overlapStartDate return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY) } module.exports = getOverlappingDaysInRanges