UNPKG

houser-js-utils

Version:

A comprehensive collection of TypeScript utility functions for common development tasks including array manipulation, string processing, date handling, random number generation, validation, and much more.

1 lines 26.7 kB
{"version":3,"file":"DateUtils.mjs","sources":["../src/DateUtils.ts"],"sourcesContent":["/**\n * @module DateUtils\n * @description Utility functions for date manipulation and calculations.\n *\n * This module provides a comprehensive set of functions for working with dates,\n * including date arithmetic, comparisons, formatting, and validation.\n *\n * @example\n * ```typescript\n * import { DateUtils } from 'houser-js-utils';\n *\n * // Add 2 days to current date\n * const tomorrow = DateUtils.add({ days: 2 });\n *\n * // Calculate age\n * const age = DateUtils.calculateAge(new Date('1990-01-01'));\n *\n * // Check if date is weekend\n * const isWeekend = DateUtils.isWeekend(new Date());\n * ```\n */\n\nexport type DateArg = Date | number | string;\n\n/**\n * Supported time units for date calculations\n */\nexport type TimeUnit =\n | \"years\"\n | \"months\"\n | \"weeks\"\n | \"days\"\n | \"hours\"\n | \"minutes\"\n | \"seconds\";\n\n/**\n * Object type for specifying time units and their values\n */\nexport type TimeUnitArgs = {\n [K in TimeUnit]?: number;\n};\n\n// Constants for time calculations\nconst MS_PER_SECOND = 1000;\nconst MS_PER_MINUTE = MS_PER_SECOND * 60;\nconst MS_PER_HOUR = MS_PER_MINUTE * 60;\nconst MS_PER_DAY = MS_PER_HOUR * 24;\n\nexport const DateUtils = {\n /**\n * Adds specified time units to a date.\n * @param args - Object containing time units to add\n * @param date - Date to add to (defaults to current date)\n * @returns New date with added time units\n * @throws {Error} If any time unit is negative\n * @example\n * ```typescript\n * DateUtils.add({ days: 7, hours: 2 }); // Add 7 days and 2 hours to now\n * DateUtils.add({ months: 1 }, new Date('2023-01-15')); // Add 1 month to specific date\n * ```\n */\n add(args: TimeUnitArgs, date: DateArg = new Date()): Date {\n this.validateTimeUnits(args);\n const dt = this.convertToDate(date);\n return this.adjustDate(args, dt, 1);\n },\n\n /**\n * Internal helper for modifying a date by adding or subtracting time units\n * @param args - Object containing time units\n * @param date - Date to modify\n * @param direction - 1 for addition, -1 for subtraction\n * @returns New date with modified time units\n */\n adjustDate(args: TimeUnitArgs, date: DateArg, direction: 1 | -1): Date {\n const result = new Date(date.valueOf());\n\n if (args.years)\n result.setFullYear(result.getFullYear() + args.years * direction);\n if (args.months)\n result.setMonth(result.getMonth() + args.months * direction);\n if (args.weeks)\n result.setDate(result.getDate() + args.weeks * 7 * direction);\n if (args.days) result.setDate(result.getDate() + args.days * direction);\n if (args.hours) result.setHours(result.getHours() + args.hours * direction);\n if (args.minutes)\n result.setMinutes(result.getMinutes() + args.minutes * direction);\n if (args.seconds)\n result.setSeconds(result.getSeconds() + args.seconds * direction);\n\n return result;\n },\n\n /**\n * Calculates age based on birth date\n * @param date - Birth date to calculate age from\n * @returns Age in years or null if date is invalid\n */\n calculateAge(date: Date | string | null): number | null {\n if (!date) {\n return null;\n }\n const now = new Date();\n const dateOfBirth = date instanceof Date ? date : new Date(date);\n\n let yearDif = now.getFullYear() - dateOfBirth.getFullYear();\n const monthDif = now.getMonth() - dateOfBirth.getMonth();\n const dateDif = now.getDate() - dateOfBirth.getDate();\n\n if (monthDif < 0 || (monthDif === 0 && dateDif < 0)) {\n yearDif--;\n }\n\n return yearDif;\n },\n\n /**\n * Calculates the number of days between two dates\n * @param first - First date\n * @param second - Second date\n * @returns Number of days between dates\n */\n calculateDaysBetween(first: DateArg, second: DateArg): number {\n const a = this.convertToDate(first);\n const b = this.convertToDate(second);\n\n const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate());\n const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate());\n\n return Math.abs(Math.floor((utc2 - utc1) / MS_PER_DAY));\n },\n\n /**\n * Compares two dates and returns the result based on order parameter\n * @param a - First date to compare\n * @param b - Second date to compare\n * @param order - Sort order ('asc' or 'desc')\n * @returns Comparison result (-1, 0, or 1)\n */\n compareDates(a: DateArg, b: DateArg, order: \"asc\" | \"desc\" = \"asc\"): number {\n const dateA = this.normalizeDate(a);\n const dateB = this.normalizeDate(b);\n\n if (!dateA && !dateB) return 0;\n if (!dateA) return order === \"asc\" ? 1 : -1;\n if (!dateB) return order === \"asc\" ? -1 : 1;\n\n const diff = dateA.getTime() - dateB.getTime();\n return order === \"asc\" ? diff : -diff;\n },\n\n /**\n * Converts various date formats to a Date object\n * @param dateStr - Date to convert (Date, number, or string)\n * @returns Date object\n * @throws Error if date string is invalid\n */\n convertToDate(dateStr: DateArg): Date {\n if (dateStr instanceof Date) {\n return new Date(dateStr.valueOf());\n }\n\n if (typeof dateStr === \"number\") {\n if (dateStr.toString().length === 10) {\n return new Date(dateStr * MS_PER_SECOND);\n }\n return new Date(dateStr);\n }\n\n if (typeof dateStr === \"string\") {\n const parsed = new Date(dateStr);\n if (isNaN(parsed.getTime())) {\n throw new Error(`Invalid date string: ${dateStr}`);\n }\n return parsed;\n }\n\n throw new Error(\"Invalid date argument\");\n },\n\n /**\n * Copies time from one date to another\n * @param fromDate - Source date to copy time from\n * @param toDate - Target date to copy time to\n * @returns New date with copied time\n */\n copyTimeToDate(fromDate: DateArg, toDate: DateArg): Date {\n const from = this.convertToDate(fromDate);\n const to = this.convertToDate(toDate);\n\n to.setHours(\n from.getHours(),\n from.getMinutes(),\n from.getSeconds(),\n from.getMilliseconds()\n );\n return to;\n },\n\n /**\n * Returns the age in years between two dates\n * @param birthDate - Birth date\n * @param referenceDate - Reference date (defaults to current date)\n * @returns Age in years\n */\n getAge(birthDate: DateArg, referenceDate: DateArg = new Date()): number {\n const birth = this.convertToDate(birthDate);\n const reference = this.convertToDate(referenceDate);\n\n let age = reference.getFullYear() - birth.getFullYear();\n const monthDiff = reference.getMonth() - birth.getMonth();\n\n if (\n monthDiff < 0 ||\n (monthDiff === 0 && reference.getDate() < birth.getDate())\n ) {\n age--;\n }\n\n return age;\n },\n\n /**\n * Returns the number of days in a given month\n * @param year - Year to check\n * @param month - Month to check (0-11)\n * @returns Number of days in the month\n */\n getDaysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n },\n\n /**\n * Returns the number of days between two dates, inclusive\n * @param startDate - Start date\n * @param endDate - End date\n * @returns Number of days between dates, inclusive\n */\n getDaysBetweenInclusive(startDate: DateArg, endDate: DateArg): number {\n return this.calculateDaysBetween(startDate, endDate) + 1;\n },\n\n /**\n * Returns the first day of the month\n * @param date - Date to get first day of month for (defaults to current date)\n * @returns Date set to first day of month\n */\n getFirstDayOfMonth(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n newDate.setDate(1);\n return this.getStartOfDay(newDate);\n },\n\n /**\n * Returns the first day of the quarter\n * @param date - Date to get first day of quarter for (defaults to current date)\n * @returns Date set to first day of quarter\n */\n getFirstDayOfQuarter(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n const quarter = this.getQuarter(newDate);\n newDate.setMonth((quarter - 1) * 3, 1);\n return this.getStartOfDay(newDate);\n },\n\n /**\n * Returns the first day of the week (Sunday)\n * @param date - Date to get first day of week for (defaults to current date)\n * @returns Date set to first day of week\n */\n getFirstDayOfWeek(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n const day = newDate.getDay();\n newDate.setDate(newDate.getDate() - day);\n return this.getStartOfDay(newDate);\n },\n\n /**\n * Returns the first day of the year\n * @param date - Date to get first day of year for (defaults to current date)\n * @returns Date set to first day of year\n */\n getFirstDayOfYear(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n newDate.setMonth(0, 1);\n return this.getStartOfDay(newDate);\n },\n\n /**\n * Returns the end of the day (23:59:59.999)\n * @param date - Date to get end of day for (defaults to current date)\n * @returns Date set to end of day\n */\n getEndOfDay(date?: DateArg): Date {\n const newDate = this.convertToDate(date || new Date());\n newDate.setHours(23, 59, 59, 999);\n return newDate;\n },\n\n /**\n * Returns the last day of the month\n * @param date - Date to get last day of month for (defaults to current date)\n * @returns Date set to last day of month\n */\n getLastDayOfMonth(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n newDate.setMonth(newDate.getMonth() + 1);\n newDate.setDate(0);\n return this.getEndOfDay(newDate);\n },\n\n /**\n * Returns the last day of the quarter\n * @param date - Date to get last day of quarter for (defaults to current date)\n * @returns Date set to last day of quarter\n */\n getLastDayOfQuarter(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n const quarter = this.getQuarter(newDate);\n newDate.setMonth(quarter * 3, 0);\n return this.getEndOfDay(newDate);\n },\n\n /**\n * Returns the last day of the week (Saturday)\n * @param date - Date to get last day of week for (defaults to current date)\n * @returns Date set to last day of week\n */\n getLastDayOfWeek(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n const day = newDate.getDay();\n newDate.setDate(newDate.getDate() + (6 - day));\n return this.getEndOfDay(newDate);\n },\n\n /**\n * Returns the last day of the year\n * @param date - Date to get last day of year for (defaults to current date)\n * @returns Date set to last day of year\n */\n getLastDayOfYear(date: DateArg = new Date()): Date {\n const newDate = this.convertToDate(date);\n newDate.setMonth(11, 31);\n return this.getEndOfDay(newDate);\n },\n\n /**\n * Returns the quarter (1-4) of the year\n * @param date - Date to get quarter for (defaults to current date)\n * @returns Quarter number\n */\n getQuarter(date: DateArg = new Date()): number {\n const month = this.convertToDate(date).getMonth();\n return Math.floor(month / 3) + 1;\n },\n\n /**\n * Returns the start of the day (00:00:00.000)\n * @param date - Date to get start of day for (defaults to current date)\n * @returns Date set to start of day\n */\n getStartOfDay(date?: DateArg): Date {\n const newDate = this.convertToDate(date || new Date());\n newDate.setHours(0, 0, 0, 0);\n return newDate;\n },\n\n /**\n * Returns the week number of the year (1-53)\n * @param date - Date to get week number for (defaults to current date)\n * @returns Week number\n */\n getWeekNumber(date: DateArg = new Date()): number {\n const newDate = this.convertToDate(date);\n const firstDayOfYear = new Date(newDate.getFullYear(), 0, 1);\n const pastDaysOfYear =\n (newDate.getTime() - firstDayOfYear.getTime()) / MS_PER_DAY;\n return Math.ceil((pastDaysOfYear + firstDayOfYear.getDay() + 1) / 7);\n },\n\n /**\n * Checks if a date is after another date\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if date1 is after date2\n */\n isAfter(date1: DateArg, date2: DateArg): boolean {\n return (\n this.convertToDate(date1).valueOf() > this.convertToDate(date2).valueOf()\n );\n },\n\n /**\n * Checks if a date is before another date\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if date1 is before date2\n */\n isBefore(date1: DateArg, date2: DateArg): boolean {\n return (\n this.convertToDate(date1).valueOf() < this.convertToDate(date2).valueOf()\n );\n },\n\n /**\n * Checks if a date is in the past\n * @param date - Date to check\n * @returns True if date is in the past\n */\n isDateInThePast(date: DateArg): boolean {\n const dateObj = this.convertToDate(date);\n return dateObj <= new Date();\n },\n\n /**\n * Checks if two dates are the same day\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if dates are the same day\n */\n isSameDay(date1: DateArg, date2: DateArg): boolean {\n const date1Obj = this.convertToDate(date1);\n const date2Obj = this.convertToDate(date2);\n return (\n date1Obj.getDate() === date2Obj.getDate() &&\n date1Obj.getMonth() === date2Obj.getMonth() &&\n date1Obj.getFullYear() === date2Obj.getFullYear()\n );\n },\n\n /**\n * Checks if two dates have the same time\n * @param date1 - First date to compare\n * @param date2 - Second date to compare\n * @returns True if dates have the same time\n */\n isSameTime(date1: DateArg, date2: DateArg): boolean {\n return (\n this.convertToDate(date1).valueOf() ===\n this.convertToDate(date2).valueOf()\n );\n },\n\n /**\n * Checks if a date is today\n * @param date - Date to check\n * @returns True if date is today\n */\n isToday(date: DateArg): boolean {\n const convertedDate = this.convertToDate(date);\n return (\n !convertedDate ||\n convertedDate.toLocaleDateString() === new Date().toLocaleDateString()\n );\n },\n\n /**\n * Checks if a date is tomorrow\n * @param date - Date to check\n * @returns True if date is tomorrow\n */\n isTomorrow(date: DateArg): boolean {\n const tomorrow = new Date();\n tomorrow.setDate(tomorrow.getDate() + 1);\n return this.isSameDay(date, tomorrow);\n },\n\n /**\n * Checks if a date is valid\n * @param date - Date to check\n * @returns True if date is valid\n */\n isValidDate(date: DateArg): boolean {\n try {\n return !Number.isNaN(this.convertToDate(date).getTime());\n } catch {\n return false;\n }\n },\n\n /**\n * Checks if a date falls on a weekday\n * @param date - Date to check\n * @returns True if the date is a weekday\n */\n isWeekday(date: DateArg): boolean {\n return !this.isWeekend(date);\n },\n\n /**\n * Checks if a date falls on a weekend\n * @param date - Date to check\n * @returns True if the date is a weekend\n */\n isWeekend(date: DateArg): boolean {\n const day = this.convertToDate(date).getUTCDay();\n return day === 0 || day === 6;\n },\n\n /**\n * Checks if a date is yesterday\n * @param date - Date to check\n * @returns True if date is yesterday\n */\n isYesterday(date: DateArg): boolean {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n return this.isSameDay(date, yesterday);\n },\n\n /**\n * Normalizes a date to UTC midnight\n * @param date - Date to normalize\n * @returns Normalized date or null if invalid\n */\n normalizeDate(date: DateArg): Date | null {\n if (!date) return null;\n\n try {\n // Handle MM/YYYY format first\n if (typeof date === \"string\") {\n const parts = date.split(\"/\");\n if (\n parts.length === 2 &&\n parts[0].length === 2 &&\n parts[1].length === 4\n ) {\n const month = parseInt(parts[0], 10);\n const year = parseInt(parts[1], 10);\n if (!isNaN(month) && !isNaN(year) && month >= 1 && month <= 12) {\n return new Date(Date.UTC(year, month - 1, 1));\n }\n }\n }\n\n // Handle other date formats\n const parsedDate = this.convertToDate(date);\n if (!isNaN(parsedDate.valueOf())) {\n return new Date(\n Date.UTC(\n parsedDate.getUTCFullYear(),\n parsedDate.getUTCMonth(),\n parsedDate.getUTCDate()\n )\n );\n }\n } catch {\n // Invalid date, return null\n }\n\n return null;\n },\n\n /**\n * Subtracts specified time units from a date\n * @param args - Object containing time units to subtract\n * @param date - Date to subtract from (defaults to current date)\n * @returns New date with subtracted time units\n * @throws Error if any time unit is negative\n */\n subtract(args: TimeUnitArgs, date: DateArg = new Date()): Date {\n this.validateTimeUnits(args);\n const dt = this.convertToDate(date);\n return this.adjustDate(args, dt, -1);\n },\n\n /**\n * Converts a date to a local ISO string\n * @param date - Date to convert\n * @returns Local ISO string representation\n */\n toLocalISOString(date: Date): string {\n const pad = (num: number): string => String(num).padStart(2, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(\n date.getDate()\n )}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(\n date.getSeconds()\n )}.${String(date.getMilliseconds()).padStart(3, \"0\")}`;\n },\n\n /**\n * Validates time unit arguments\n * @param args - Time unit arguments to validate\n * @throws Error if any time unit is negative\n */\n validateTimeUnits(args: TimeUnitArgs): void {\n for (const [unit, value] of Object.entries(args)) {\n if (value !== undefined && value < 0) {\n throw new Error(\n `Negative values are not allowed for time unit: ${unit}`\n );\n }\n }\n },\n};\n"],"names":[],"mappings":"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"}