UNPKG

sugar

Version:

A Javascript utility library for working with native objects.

78 lines (69 loc) 2.53 kB
'use strict'; var MINUTES = require('../var/MINUTES'), DateUnits = require('../var/DateUnits'), DateUnitIndexes = require('../var/DateUnitIndexes'), _utc = require('../../common/var/_utc'), tzOffset = require('./tzOffset'), cloneDate = require('./cloneDate'), isDefined = require('../../common/internal/isDefined'), advanceDate = require('./advanceDate'), dateIsValid = require('./dateIsValid'), moveToEndOfUnit = require('./moveToEndOfUnit'), getExtendedDate = require('./getExtendedDate'), moveToBeginningOfUnit = require('./moveToBeginningOfUnit'); var MONTH_INDEX = DateUnitIndexes.MONTH_INDEX; function compareDate(date, d, margin, localeCode, options) { var loMargin = 0, hiMargin = 0, timezoneShift, compareEdges, override, min, max, p, t; function getTimezoneShift() { // If there is any specificity in the date then we're implicitly not // checking absolute time, so ignore timezone shifts. if (p.set && p.set.specificity) { return 0; } return (tzOffset(p.date) - tzOffset(date)) * MINUTES; } function addSpecificUnit() { var unit = DateUnits[p.set.specificity]; return advanceDate(cloneDate(p.date), unit.name, 1).getTime() - 1; } if (_utc(date)) { options = options || {}; options.fromUTC = true; options.setUTC = true; } p = getExtendedDate(null, d, options, true); if (margin > 0) { loMargin = hiMargin = margin; override = true; } if (!dateIsValid(p.date)) return false; if (p.set && p.set.specificity) { if (isDefined(p.set.edge) || isDefined(p.set.shift)) { compareEdges = true; moveToBeginningOfUnit(p.date, p.set.specificity, localeCode); } if (compareEdges || p.set.specificity === MONTH_INDEX) { max = moveToEndOfUnit(cloneDate(p.date), p.set.specificity, localeCode).getTime(); } else { max = addSpecificUnit(); } if (!override && isDefined(p.set.sign) && p.set.specificity) { // If the time is relative, there can occasionally be an disparity between // the relative date and "now", which it is being compared to, so set an // extra margin to account for this. loMargin = 50; hiMargin = -50; } } t = date.getTime(); min = p.date.getTime(); max = max || min; timezoneShift = getTimezoneShift(); // istanbul ignore if if (timezoneShift) { min -= timezoneShift; max -= timezoneShift; } return t >= (min - loMargin) && t <= (max + hiMargin); } module.exports = compareDate;