import { UnitOfTime } from '../types'; import { endOf, startOf } from './start-end-of'; export function isAfter(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean { if (!date1 || !date2) { return false; } if (units === 'milliseconds') { return date1.valueOf() > date2.valueOf(); } return date2.valueOf() < startOf(date1, units).valueOf(); } export function isBefore(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean { if (!date1 || !date2) { return false; } if (units === 'milliseconds') { return date1.valueOf() < date2.valueOf(); } return endOf(date1, units).valueOf() < date2.valueOf(); } export function isBetween(date: Date, from: Date, to: Date, units: UnitOfTime, inclusivity = '()'): boolean { const leftBound = inclusivity[0] === '(' ? isAfter(date, from, units) : !isBefore(date, from, units); const rightBound = inclusivity[1] === ')' ? isBefore(date, to, units) : !isAfter(date, to, units); return leftBound && rightBound; } export function isSame(date1: Date, date2: Date, units: UnitOfTime = 'milliseconds'): boolean { if (!date1 || !date2) { return false; } if (units === 'milliseconds') { return date1.valueOf() === date2.valueOf(); } const inputMs = date2.valueOf(); return startOf(date1, units).valueOf() <= inputMs && inputMs <= endOf(date1, units).valueOf(); } export function isSameOrAfter(date1: Date, date2: Date, units?: UnitOfTime): boolean { return isSame(date1, date2, units) || isAfter(date1, date2, units); } export function isSameOrBefore(date1: Date, date2: Date, units?: UnitOfTime): boolean { return isSame(date1, date2, units) || isBefore(date1, date2, units); }