UNPKG

@mfuon2/chrono-utilz

Version:

A comprehensive date utility library built on Three Pillars Architecture: Core Operations (45+ functions), Business Utilities (55+ functions), and Formatting & Parsing (35+ functions). Features natural language parsing, timezone conversion, fiscal periods

1,556 lines (1,554 loc) 69.8 kB
/** * Get user's current timezone using Intl API * @returns {string} The user's IANA timezone identifier */ declare function getUserTimezone(): string; /** * Get all available timezones filtered by region * @param region - Region to filter by (e.g., 'America', 'Europe', 'Asia') * @returns Array of timezone objects in the specified region */ declare function getTimezonesByRegion(region: string): Array<{ id: string; offset: number; description: string; }>; /** * Search timezones by description or ID * @param query - Search query * @returns Array of matching timezone objects */ declare function searchTimezones(query: string): Array<{ id: string; offset: number; description: string; }>; /** * Get timezones by GMT offset * @param offset - GMT offset in hours * @returns Array of timezone objects with the specified offset */ declare function getTimezonesByOffset(offset: number): Array<{ id: string; offset: number; description: string; }>; /** * Create a comprehensive timezone type for TypeScript */ declare const TIMEZONE_IDS: string[]; /** * ChronoUtilz - A comprehensive date utility library built on Three Pillars Architecture * * Three Pillars Architecture: * - Core Operations (45+ functions): Date manipulation & comparison * - Business Utilities (55+ functions): Real-world business logic * - Formatting & Parsing (35+ functions): Advanced presentation * * 🚀 Business-Ready Features: * - Working days with holiday support * - Fiscal quarters and periods * - Natural language parsing ("next Friday") * - Timezone conversion between IANA zones * - Recurring date patterns * - Advanced duration calculations * * Compatible with TypeScript, JavaScript and Node.js * @module ChronoUtilz * @version 2.0.0 */ /** * Configure global timezone behavior for ChronoUtilz * @param config - Timezone configuration */ declare function configureTimezone(config: { defaultTimezone?: IANATimezone; autoDetect?: boolean; }): void; /** * Get current timezone configuration * @returns Current configuration */ declare function getTimezoneConfig(): { defaultTimezone: string; autoDetect: boolean; currentEffectiveTimezone: string; }; /** * DateFormat options for formatting dates */ type DateFormat = 'YYYY-MM-DD' | 'MM/DD/YYYY' | 'DD/MM/YYYY' | 'YYYY-MM-DD HH:mm:ss' | 'DD MMM YYYY' | 'MMM DD, YYYY' | 'HH:mm:ss' | 'hh:mm A'; /** * TimeUnit for duration calculations */ type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year'; /** * IANA Timezone identifiers - Complete standardized list */ type IANATimezone = typeof TIMEZONE_IDS[number] | string; /** * Natural language time expressions */ type NaturalTimeExpression = 'now' | 'today' | 'tomorrow' | 'yesterday' | 'next week' | 'last week' | 'next month' | 'last month' | 'next year' | 'last year' | 'next monday' | 'next tuesday' | 'next wednesday' | 'next thursday' | 'next friday' | 'next saturday' | 'next sunday' | 'last monday' | 'last tuesday' | 'last wednesday' | 'last thursday' | 'last friday' | 'last saturday' | 'last sunday' | 'beginning of week' | 'end of week' | 'beginning of month' | 'end of month' | 'beginning of year' | 'end of year' | string; /** * Recurring pattern types */ type RecurringPattern = 'daily' | 'weekly' | 'biweekly' | 'monthly' | 'quarterly' | 'yearly' | 'weekdays' | 'weekends' | 'custom'; /** * Fiscal year configuration */ interface FiscalYearConfig { startMonth: number; startDay: number; } /** * ChronoUtilz options for parsing dates */ interface DateParseOptions { /** * Whether to throw an error if the date is invalid */ throwError?: boolean; /** * The fallback date to use if parsing fails */ fallback?: Date | null; /** * Timezone to use for parsing (defaults to user's timezone) */ timezone?: IANATimezone; } /** * Timezone conversion options */ interface TimezoneConversionOptions { from?: IANATimezone; to: IANATimezone; preserveTime?: boolean; } /** * Timezone conversion options */ interface TimezoneConversionOptions { from?: IANATimezone; to: IANATimezone; preserveTime?: boolean; } /** * Advanced formatting options */ interface AdvancedFormatOptions { locale?: string; timezone?: IANATimezone; includeTime?: boolean; includeSeconds?: boolean; use24Hour?: boolean; includeDayOfWeek?: boolean; includeTimezone?: boolean; } /** * Advanced formatting options */ interface AdvancedFormatOptions { locale?: string; timezone?: IANATimezone; includeTime?: boolean; includeSeconds?: boolean; use24Hour?: boolean; includeDayOfWeek?: boolean; includeTimezone?: boolean; } /** * Recurring date configuration */ interface RecurringConfig { pattern: RecurringPattern; interval?: number; daysOfWeek?: number[]; daysOfMonth?: number[]; monthsOfYear?: number[]; endDate?: Date; maxOccurrences?: number; } /** * Recurring date configuration */ interface RecurringConfig { pattern: RecurringPattern; interval?: number; daysOfWeek?: number[]; daysOfMonth?: number[]; monthsOfYear?: number[]; endDate?: Date; maxOccurrences?: number; } /** * Natural language parsing options */ interface NaturalLanguageOptions { baseDate?: Date; timezone?: IANATimezone; strictParsing?: boolean; } /** * Natural language parsing options */ interface NaturalLanguageOptions { baseDate?: Date; timezone?: IANATimezone; strictParsing?: boolean; } /** * Duration display options */ interface DurationDisplayOptions { precision?: number; units?: TimeUnit[]; format?: 'long' | 'short' | 'narrow'; separator?: string; includeZeroValues?: boolean; } /** * Duration display options */ interface DurationDisplayOptions { precision?: number; units?: TimeUnit[]; format?: 'long' | 'short' | 'narrow'; separator?: string; includeZeroValues?: boolean; } /** * Holiday configuration */ interface HolidayConfig { country?: string; region?: string; includeObserved?: boolean; customHolidays?: Date[]; } /** * Holiday configuration */ interface HolidayConfig { country?: string; region?: string; includeObserved?: boolean; customHolidays?: Date[]; } /** * Working time configuration */ interface WorkingTimeConfig { startHour: number; endHour: number; workingDays: number[]; timezone?: IANATimezone; excludeHolidays?: boolean; holidayConfig?: HolidayConfig; } /** * Working time configuration */ interface WorkingTimeConfig { startHour: number; endHour: number; workingDays: number[]; timezone?: IANATimezone; excludeHolidays?: boolean; holidayConfig?: HolidayConfig; } /** * Date comparison result */ interface DateComparison { isBefore: boolean; isAfter: boolean; isSame: boolean; difference: { years: number; months: number; days: number; hours: number; minutes: number; seconds: number; milliseconds: number; }; } /** * Date comparison result */ interface DateComparison { isBefore: boolean; isAfter: boolean; isSame: boolean; difference: { years: number; months: number; days: number; hours: number; minutes: number; seconds: number; milliseconds: number; }; } /** * Fiscal period information */ interface FiscalPeriod { quarter: number; year: number; startDate: Date; endDate: Date; isCurrentPeriod: boolean; } /** * Fiscal period information */ interface FiscalPeriod { quarter: number; year: number; startDate: Date; endDate: Date; isCurrentPeriod: boolean; } /** * Calendar event interface */ interface CalendarEvent { id?: string; title: string; startDate: Date; endDate?: Date; isAllDay?: boolean; recurring?: RecurringConfig; timezone?: IANATimezone; } /** * Calendar event interface */ interface CalendarEvent { id?: string; title: string; startDate: Date; endDate?: Date; isAllDay?: boolean; recurring?: RecurringConfig; timezone?: IANATimezone; } /** * ChronoUtilz error class */ declare class ChronoUtilzError extends Error { constructor(message: string); } /** * Safely parses a date string or timestamp into a Date object * @param input - The input to parse as a date * @param options - Parsing options * @returns A Date object or null if invalid and throwError is false * @throws {ChronoUtilzError} If the date is invalid and throwError is true */ declare function parseDate(input: string | number | Date, options?: DateParseOptions): Date | null; /** * Formats a date according to the specified format * @param date - The date to format * @param format - The format pattern * @returns Formatted date string * @throws {ChronoUtilzError} If the date is invalid */ declare function formatDate(date: Date | string | number, format?: DateFormat, timezone?: IANATimezone): string; /** * Adds time to a date * @param date - The base date * @param amount - The amount to add * @param unit - The time unit * @returns A new Date with the added time */ declare function addTime(date: Date | string | number, amount: number, unit: TimeUnit, timezone?: IANATimezone): Date; /** * Subtracts time from a date * @param date - The base date * @param amount - The amount to subtract * @param unit - The time unit * @param timezone - Optional timezone (defaults to user's timezone) * @returns A new Date with the subtracted time */ declare function subtractTime(date: Date | string | number, amount: number, unit: TimeUnit, timezone?: IANATimezone): Date; /** * Gets the difference between two dates in the specified unit * @param date1 - The first date * @param date2 - The second date * @param unit - The time unit * @returns The difference in the specified unit */ declare function getDateDiff(date1: Date | string | number, date2: Date | string | number, unit: TimeUnit, timezone?: IANATimezone): number; /** * Calculates remaining time until a target date, or elapsed time if past * @param targetDate - The target date to calculate time to/from * @param unit - The time unit to return (default: 'millisecond') * @param referenceDate - Optional reference date (default: now) * @param timezone - Optional timezone (defaults to user's timezone) * @returns Positive number if target is in future (remaining time), negative if past (elapsed time) */ declare function remainingTime(targetDate: Date | string | number, unit?: TimeUnit, referenceDate?: Date | string | number, timezone?: IANATimezone): number; /** * Checks if a date is between two other dates * @param date - The date to check * @param startDate - The start date * @param endDate - The end date * @param inclusive - Whether to include the boundaries * @returns True if the date is between the start and end dates */ declare function isBetweenDates(date: Date | string | number, startDate: Date | string | number, endDate: Date | string | number, inclusive?: boolean): boolean; /** * Validates whether a given input is a valid date in supported formats. * Checks if a date is valid * @param date - The date to check * @returns True if the date is valid */ declare function isValidDate(date: any): boolean; /** * Gets the start of a time unit (e.g., start of day, start of month) * @param date - The reference date * @param unit - The time unit * @returns A new Date representing the start of the specified unit */ declare function startOf(date: Date | string | number, unit: Exclude<TimeUnit, 'millisecond' | 'second' | 'minute'>): Date; /** * Gets the end of a time unit (e.g., end of day, end of month) * @param date - The reference date * @param unit - The time unit * @returns A new Date representing the end of the specified unit */ declare function endOf(date: Date | string | number, unit: Exclude<TimeUnit, 'millisecond' | 'second' | 'minute'>): Date; /** * Gets the day of the year (1-366) * @param date - The date * @returns The day of the year */ declare function getDayOfYear(date: Date | string | number): number; /** * Gets the week of the year (1-53) * @param date - The date * @returns The week of the year */ declare function getWeekOfYear(date: Date | string | number): number; /** * Checks if a year is a leap year * @param year - The year to check or a date * @returns True if the year is a leap year */ declare function isLeapYear(year: number | Date | string): boolean; /** * Gets the number of days in a month * @param date - The reference date * @returns The number of days in the month */ declare function getDaysInMonth(date: Date | string | number): number; /** * Returns a relative time string (e.g., "5 minutes ago", "in 2 days") * @param date - The date to get relative time for * @param baseDate - The base date (defaults to now) * @returns A human-readable relative time string */ declare function getRelativeTime(date: Date | string | number, baseDate?: Date | string | number): string; /** * Gets the timezone offset in minutes * @param date - The date to get timezone offset for * @returns Timezone offset in minutes */ declare function getTimezoneOffset(date?: Date | string | number): number; /** * Creates a date from components * @param year - The year * @param month - The month (0-11) * @param day - The day (1-31) * @param hours - The hours (0-23) * @param minutes - The minutes (0-59) * @param seconds - The seconds (0-59) * @param milliseconds - The milliseconds (0-999) * @returns A new Date object */ declare function createDate(year: number, month: number, day: number, hours?: number, minutes?: number, seconds?: number, milliseconds?: number): Date; /** * A calendar date without time information */ declare class CalendarDate { private _year; private _month; private _day; /** * Creates a new CalendarDate * @param year - The year * @param month - The month (1-12) * @param day - The day (1-31) */ constructor(year: number, month: number, day: number); /** * Creates a CalendarDate from a Date object * @param date - The Date object * @returns A new CalendarDate */ static fromDate(date: Date): CalendarDate; /** * Creates a CalendarDate from a string or timestamp * @param input - The input to parse * @returns A new CalendarDate */ static fromString(input: string | number): CalendarDate; /** * Gets the year */ get year(): number; /** * Gets the month (1-12) */ get month(): number; /** * Gets the day (1-31) */ get day(): number; /** * Converts to a JavaScript Date object (at midnight local time) * @returns A new Date object */ toDate(): Date; /** * Returns an ISO date string (YYYY-MM-DD) * @returns ISO date string */ toString(): string; /** * Adds time to this calendar date * @param amount - The amount to add * @param unit - The time unit (limited to day, week, month, year) * @returns A new CalendarDate */ add(amount: number, unit: Extract<TimeUnit, 'day' | 'week' | 'month' | 'year'>): CalendarDate; /** * Checks if this calendar date is equal to another * @param other - The other calendar date * @returns True if the dates are equal */ equals(other: CalendarDate): boolean; /** * Compares this calendar date with another * @param other - The other calendar date * @returns Negative if this < other, 0 if equal, positive if this > other */ compare(other: CalendarDate): number; /** * Checks if this calendar date is before another * @param other - The other calendar date * @returns True if this date is before the other */ isBefore(other: CalendarDate): boolean; /** * Checks if this calendar date is after another * @param other - The other calendar date * @returns True if this date is after the other */ isAfter(other: CalendarDate): boolean; } /** * Gets the current UTC date and time * @returns The current UTC date and time */ declare function utcNow(): Date; /** * Converts a date to UTC * @param date - The date to convert * @returns A new Date in UTC */ declare function toUTC(date: Date | string | number): Date; /** * Gets a string representation of the current timezone * @returns Timezone string (e.g., "UTC+2") */ declare function getTimezoneString(): string; /** * Validates if a date string matches a specific format * @param dateStr - The date string to validate * @param format - The expected format * @returns True if the date string matches the format and is valid */ declare function validateDateFormat(dateStr: string, format: DateFormat): boolean; /** * Options for date range generation */ interface DateRangeOptions { /** The start date of the range */ start: Date | string; /** The end date of the range */ end: Date | string; /** The increment unit (default: 'day') */ unit?: TimeUnit; /** The increment value (default: 1) */ step?: number; /** Whether to include the end date (default: true) */ inclusive?: boolean; } /** * Generates an array of dates between a start and end date * * @example * ``` * // Generate dates for each day in May 2025 * const datesInMay = ChronoUtilzHelper.generateDateRange({ * start: '2025-05-01', * end: '2025-05-31' * }); * ``` * * @param options - Configuration options for the date range * @returns An array of Date objects */ declare function generateDateRange(options: DateRangeOptions): Date[]; /** * Gets a human-readable duration string from milliseconds * * @example * ``` * // "2 days, 4 hours, 30 minutes" * const duration = ChronoUtilzHelper.formatDuration(189000000); * ``` * * @param milliseconds - The duration in milliseconds * @param options - Formatting options * @returns A formatted duration string */ declare function formatDuration(milliseconds: number, options?: { longFormat?: boolean; maxUnits?: number; }): string; /** * Returns the quarter number (1-4) for a given date * * @example * ``` * const quarter = ChronoUtilzHelper.getQuarter(new Date(2025, 4, 15)); // 2 (Q2) * ``` * * @param date - The date to get the quarter for * @returns The quarter number (1-4) */ declare function getQuarter(date: Date | string): number; /** * Returns the first or last date of a quarter * * @example * ``` * // Get the first day of the current quarter * const startOfQuarter = ChronoUtilzHelper.getQuarterDate(new Date(), 'start'); * * // Get the last day of Q3 2025 * const endOfQ3 = ChronoUtilzHelper.getQuarterDate(new Date(2025, 8, 15), 'end'); * ``` * * @param date - The reference date * @param type - Either 'start' or 'end' of the quarter * @returns Date object representing the start or end of the quarter */ declare function getQuarterDate(date: Date | string, type: 'start' | 'end'): Date; /** * Calculates business days between two dates (excluding weekends and optionally holidays) * * @example * ``` * // Calculate business days between two dates * const workDays = ChronoUtilzHelper.getBusinessDays( * '2025-05-01', * '2025-05-15', * ['2025-05-05'] // Optional holidays to exclude * ); * ``` * * @param startDate - Start date * @param endDate - End date * @param holidays - Optional array of holiday dates to exclude * @returns Number of business days between dates */ declare function getBusinessDays(startDate: Date | string, endDate: Date | string, holidays?: (Date | string)[]): number; /** * Age calculator that handles leap years and different formats * * @example * ``` * // Calculate age in years * const age = ChronoUtilzHelper.calculateAge('1990-05-15'); // 35 (in 2025) * * // Calculate age in multiple units * const detailedAge = ChronoUtilzHelper.calculateAge('1990-05-15', { * units: ['year', 'month', 'day'] * }); // { years: 35, months: 0, days: 23 } (if today is May 7, 2025) * ``` * * @param birthDate - The birth date * @param options - Calculation options * @returns Age in years or detailed object with multiple units */ declare function calculateAge(birthDate: Date | string, options?: { referenceDate?: Date | string; units?: ('year' | 'month' | 'day')[]; }): number | { years: number; months: number; days: number; }; /** * Creates a deep copy of a Date object * @param date - The date to clone * @returns A new Date object with the same time value */ declare function cloneDate(date: Date | string | number): Date; /** * Returns the earliest date from an array of dates * @param dates - Array of dates to compare * @returns The earliest date */ declare function minDate(...dates: (Date | string | number)[]): Date; /** * Returns the latest date from an array of dates * @param dates - Array of dates to compare * @returns The latest date */ declare function maxDate(...dates: (Date | string | number)[]): Date; /** * Rounds a date to the nearest specified unit * @param date - The date to round * @param unit - The time unit to round to * @returns A new Date rounded to the nearest unit */ declare function roundToNearest(date: Date | string | number, unit: Extract<TimeUnit, 'minute' | 'hour' | 'day'>): Date; /** * Compares two dates and returns -1, 0, or 1 * @param date1 - First date * @param date2 - Second date * @param unit - Optional time unit for comparison precision * @returns -1 if date1 < date2, 0 if equal, 1 if date1 > date2 */ declare function compareDates(date1: Date | string | number, date2: Date | string | number, unit?: TimeUnit): -1 | 0 | 1; /** * Gets the Unix timestamp for a date * @param date - The date to convert * @param inSeconds - Whether to return timestamp in seconds (default: false, returns milliseconds) * @returns Unix timestamp */ declare function getTimestamp(date: Date | string | number, inSeconds?: boolean): number; /** * Creates a Date from a Unix timestamp * @param timestamp - Unix timestamp in milliseconds or seconds * @returns A new Date object */ declare function fromTimestamp(timestamp: number): Date; /** * Generates a random date between two dates * @param startDate - The start of the range * @param endDate - The end of the range * @returns A random Date within the specified range */ declare function randomDate(startDate: Date | string | number, endDate: Date | string | number): Date; /** * Copies the time portion (hours, minutes, seconds, milliseconds) from one date to another * @param fromDate - The date to copy time from * @param toDate - The date to copy time to * @returns A new Date with the date from toDate and time from fromDate */ declare function copyTime(fromDate: Date | string | number, toDate: Date | string | number): Date; /** * Truncates a date to the specified unit (sets smaller units to their minimum values) * @param date - The date to truncate * @param unit - The time unit to truncate to * @returns A new Date truncated to the specified unit */ declare function truncateToUnit(date: Date | string | number, unit: TimeUnit): Date; /** * Sets the time components of a date * @param date - The base date * @param hours - Hours (0-23) * @param minutes - Minutes (0-59), optional * @param seconds - Seconds (0-59), optional * @param milliseconds - Milliseconds (0-999), optional * @returns A new Date with the specified time components */ declare function setTime(date: Date | string | number, hours: number, minutes?: number, seconds?: number, milliseconds?: number): Date; /** * Checks if two dates fall on the same day * @param date1 - First date to compare * @param date2 - Second date to compare * @returns True if both dates are on the same day */ declare function isSameDay(date1: Date | string | number, date2: Date | string | number): boolean; /** * Checks if two dates fall in the same week (Sunday-Saturday) * @param date1 - First date to compare * @param date2 - Second date to compare * @returns True if both dates are in the same week */ declare function isSameWeek(date1: Date | string | number, date2: Date | string | number): boolean; /** * Checks if two dates fall in the same month and year * @param date1 - First date to compare * @param date2 - Second date to compare * @returns True if both dates are in the same month and year */ declare function isSameMonth(date1: Date | string | number, date2: Date | string | number): boolean; /** * Checks if two dates fall in the same year * @param date1 - First date to compare * @param date2 - Second date to compare * @returns True if both dates are in the same year */ declare function isSameYear(date1: Date | string | number, date2: Date | string | number): boolean; /** * Checks if the first date is after the second date * @param date1 - First date to compare * @param date2 - Second date to compare * @param unit - Optional time unit for comparison precision * @returns True if date1 is after date2 */ declare function isAfter(date1: Date | string | number, date2: Date | string | number, unit?: TimeUnit): boolean; /** * Checks if the first date is before the second date * @param date1 - First date to compare * @param date2 - Second date to compare * @param unit - Optional time unit for comparison precision * @returns True if date1 is before date2 */ declare function isBefore(date1: Date | string | number, date2: Date | string | number, unit?: TimeUnit): boolean; /** * Checks if a date falls within a specified range * @param date - The date to check * @param startDate - The start of the range * @param endDate - The end of the range * @param inclusive - Whether to include the boundaries (default: true) * @returns True if the date is within the specified range */ declare function isWithinRange(date: Date | string | number, startDate: Date | string | number, endDate: Date | string | number, inclusive?: boolean): boolean; /** * Validates if a date range is valid (start date is before or equal to end date) * @param startDate - The start date of the range * @param endDate - The end date of the range * @returns True if the range is valid */ declare function isValidRange(startDate: Date | string | number, endDate: Date | string | number): boolean; /** * Sort order for date arrays */ type SortOrder = 'asc' | 'desc'; /** * Sorts an array of dates in ascending or descending order * @param dateArray - Array of dates to sort * @param order - Sort order ('asc' for ascending, 'desc' for descending) * @returns A new sorted array of Date objects */ declare function sortDates(dateArray: (Date | string | number)[], order?: SortOrder): Date[]; /** * Gets the earliest date from an array of dates * @param dateArray - Array of dates to compare * @returns The earliest date as a new Date object */ declare function getEarliestDate(dateArray: (Date | string | number)[]): Date; /** * Gets the latest date from an array of dates * @param dateArray - Array of dates to compare * @returns The latest date as a new Date object */ declare function getLatestDate(dateArray: (Date | string | number)[]): Date; /** * Removes duplicate dates from an array (based on day precision) * @param dateArray - Array of dates that may contain duplicates * @param unit - Time unit for comparison precision (default: 'day') * @returns A new array with duplicate dates removed */ declare function removeDuplicateDates(dateArray: (Date | string | number)[], unit?: TimeUnit): Date[]; /** * Checks if the given date is the first day of the month * @param date - The date to check * @returns True if it's the first day of the month * * @example * ```typescript * isFirstDayOfMonth(new Date('2024-01-01')) // true * isFirstDayOfMonth(new Date('2024-01-15')) // false * ``` */ declare function isFirstDayOfMonth(date: Date | string | number): boolean; /** * Checks if the given date is the last day of the month * @param date - The date to check * @returns True if it's the last day of the month * * @example * ```typescript * isLastDayOfMonth(new Date('2024-01-31')) // true * isLastDayOfMonth(new Date('2024-02-29')) // true (leap year) * isLastDayOfMonth(new Date('2024-01-15')) // false * ``` */ declare function isLastDayOfMonth(date: Date | string | number): boolean; /** * Checks if the given date is the first day of the year (January 1st) * @param date - The date to check * @returns True if it's January 1st * * @example * ```typescript * isFirstDayOfYear(new Date('2024-01-01')) // true * isFirstDayOfYear(new Date('2024-12-31')) // false * ``` */ declare function isFirstDayOfYear(date: Date | string | number): boolean; /** * Checks if the given date is the last day of the year (December 31st) * @param date - The date to check * @returns True if it's December 31st * * @example * ```typescript * isLastDayOfYear(new Date('2024-12-31')) // true * isLastDayOfYear(new Date('2024-01-01')) // false * ``` */ declare function isLastDayOfYear(date: Date | string | number): boolean; /** * Week boundaries result interface */ interface WeekBoundaries { /** Start of the week */ start: Date; /** End of the week */ end: Date; } /** * Gets the start and end dates of the week containing the given date * @param date - The date to find week boundaries for * @param weekStartsOn - Day of week that starts the week (0=Sunday, 1=Monday, etc.) * @returns Object with 'start' and 'end' Date properties * * @example * ```typescript * // For a date in mid-week (Monday start) * getWeekBoundaries(new Date('2024-01-15')) * // Returns: { start: Monday date, end: Sunday date } * * // Sunday start week * getWeekBoundaries(new Date('2024-01-15'), 0) * // Returns: { start: Sunday date, end: Saturday date } * ``` */ declare function getWeekBoundaries(date: Date | string | number, weekStartsOn?: number): WeekBoundaries; /** * Month boundaries result interface */ interface MonthBoundaries { /** Start of the month */ start: Date; /** End of the month */ end: Date; } /** * Gets the start and end dates of the month containing the given date * @param date - The date to find month boundaries for * @returns Object with 'start' and 'end' Date properties * * @example * ```typescript * getMonthBoundaries(new Date('2024-01-15')) * // Returns: { start: 2024-01-01 00:00:00, end: 2024-01-31 23:59:59 } * * getMonthBoundaries(new Date('2024-02-15')) * // Returns: { start: 2024-02-01 00:00:00, end: 2024-02-29 23:59:59 } (leap year) * ``` */ declare function getMonthBoundaries(date: Date | string | number): MonthBoundaries; /** * Year boundaries result interface */ interface YearBoundaries { /** Start of the year */ start: Date; /** End of the year */ end: Date; } /** * Gets the start and end dates of the specified year * @param year - The year to get boundaries for * @returns Object with 'start' and 'end' Date properties * * @example * ```typescript * getYearBoundaries(2024) * // Returns: { start: 2024-01-01 00:00:00, end: 2024-12-31 23:59:59 } * ``` */ declare function getYearBoundaries(year: number): YearBoundaries; /** * Quarter boundaries result interface */ interface QuarterBoundaries { /** Start of the quarter */ start: Date; /** End of the quarter */ end: Date; } /** * Gets the start and end dates of the specified quarter in the given year * @param year - The year * @param quarter - The quarter (1, 2, 3, or 4) * @returns Object with 'start' and 'end' Date properties * * @example * ```typescript * getQuarterBoundaries(2024, 1) * // Returns: { start: 2024-01-01 00:00:00, end: 2024-03-31 23:59:59 } * * getQuarterBoundaries(2024, 4) * // Returns: { start: 2024-10-01 00:00:00, end: 2024-12-31 23:59:59 } * ``` */ declare function getQuarterBoundaries(year: number, quarter: number): QuarterBoundaries; /** * Returns a new date with time set to midnight (00:00:00.000) * @param date - The date to strip time from * @returns New date at midnight * * @example * ```typescript * stripTime(new Date('2024-01-15 14:30:45')) * // Returns: 2024-01-15 00:00:00.000 * ``` */ declare function stripTime(date: Date | string | number): Date; /** * Returns a new date set to midnight (00:00:00.000) of the given date * Alias for stripTime() for semantic clarity * @param date - The date to set to midnight * @returns New date at midnight * * @example * ```typescript * getMidnight(new Date('2024-01-15 14:30:45')) * // Returns: 2024-01-15 00:00:00.000 * ``` */ declare function getMidnight(date: Date | string | number): Date; /** * Returns a new date set to noon (12:00:00.000) of the given date * @param date - The date to set to noon * @returns New date at noon * * @example * ```typescript * getNoon(new Date('2024-01-15 14:30:45')) * // Returns: 2024-01-15 12:00:00.000 * ``` */ declare function getNoon(date: Date | string | number): Date; /** * Global configuration for working days and holidays */ interface BusinessDayConfig { /** Working days (0=Sunday, 1=Monday, ..., 6=Saturday) */ workingDays: number[]; /** Array of holiday dates (ISO strings or Date objects) */ holidays: Set<string>; } /** * Configures which days of the week are considered working days * @param dayArray - Array of day numbers (0=Sunday, 1=Monday, ..., 6=Saturday) * @returns The updated configuration for method chaining * * @example * ```typescript * // Standard Monday-Friday * configureWorkingDays([1, 2, 3, 4, 5]) * * // Sunday-Thursday (Middle East style) * configureWorkingDays([0, 1, 2, 3, 4]) * * // Monday-Saturday * configureWorkingDays([1, 2, 3, 4, 5, 6]) * ``` */ declare function configureWorkingDays(dayArray: number[]): BusinessDayConfig; /** * Adds holidays to the business day configuration * @param holidays - Array of holiday dates * @returns The updated configuration for method chaining * * @example * ```typescript * configureHolidays([ * '2024-01-01', // New Year's Day * '2024-07-04', // Independence Day * '2024-12-25' // Christmas Day * ]) * ``` */ declare function configureHolidays(holidays: (Date | string | number)[]): BusinessDayConfig; /** * Gets the current business day configuration * @returns A copy of the current configuration */ declare function getBusinessDayConfig(): BusinessDayConfig; /** * Resets business day configuration to defaults * @returns The reset configuration */ declare function resetBusinessDayConfig(): BusinessDayConfig; /** * Checks if a date falls on a weekend * @param date - The date to check * @returns True if the date is a weekend * * @example * ```typescript * isWeekend(new Date('2024-01-06')) // true (Saturday) * isWeekend(new Date('2024-01-08')) // false (Monday) * ``` */ declare function isWeekend(date: Date | string | number): boolean; /** * Checks if a date falls on a weekday (according to current working day configuration) * @param date - The date to check * @returns True if the date is a weekday * * @example * ```typescript * isWeekday(new Date('2024-01-08')) // true (Monday) * isWeekday(new Date('2024-01-06')) // false (Saturday) * ``` */ declare function isWeekday(date: Date | string | number): boolean; /** * Checks if a date is a business day (weekday and not a holiday) * @param date - The date to check * @returns True if the date is a business day * * @example * ```typescript * isBusinessDay(new Date('2024-01-08')) // true (Monday, not holiday) * isBusinessDay(new Date('2024-01-01')) // false (New Year's Day) * isBusinessDay(new Date('2024-01-06')) // false (Saturday) * ``` */ declare function isBusinessDay(date: Date | string | number): boolean; /** * Adds the specified number of business days to a date * @param date - The starting date * @param businessDays - Number of business days to add * @returns A new date with business days added * * @example * ```typescript * // Add 5 business days to Friday, Jan 5, 2024 * addBusinessDays(new Date('2024-01-05'), 5) * // Returns: Friday, Jan 12, 2024 (skips weekends) * ``` */ declare function addBusinessDays(date: Date | string | number, businessDays: number, timezone?: IANATimezone): Date; /** * Subtracts the specified number of business days from a date * @param date - The starting date * @param businessDays - Number of business days to subtract * @returns A new date with business days subtracted * * @example * ```typescript * // Subtract 3 business days from Wednesday, Jan 10, 2024 * subtractBusinessDays(new Date('2024-01-10'), 3) * // Returns: Friday, Jan 5, 2024 (skips weekend) * ``` */ declare function subtractBusinessDays(date: Date | string | number, businessDays: number): Date; /** * Gets the next business day from the given date * @param date - The starting date * @returns The next business day * * @example * ```typescript * // From Friday, Jan 5, 2024 * getNextBusinessDay(new Date('2024-01-05')) * // Returns: Monday, Jan 8, 2024 * ``` */ declare function getNextBusinessDay(date: Date | string | number): Date; /** * Gets the previous business day from the given date * @param date - The starting date * @returns The previous business day * * @example * ```typescript * // From Monday, Jan 8, 2024 * getPreviousBusinessDay(new Date('2024-01-08')) * // Returns: Friday, Jan 5, 2024 * ``` */ declare function getPreviousBusinessDay(date: Date | string | number): Date; /** * Counts the number of business days in a given month * @param year - The year * @param month - The month (1-12) * @returns Number of business days in the month * * @example * ```typescript * businessDaysInMonth(2024, 1) // Returns: 23 (January 2024) * businessDaysInMonth(2024, 12) // Returns: 22 (December 2024) * ``` */ declare function businessDaysInMonth(year: number, month: number): number; /** * Calculates the difference in business days between two dates * @param startDate - The start date * @param endDate - The end date * @returns Number of business days between the dates (positive if endDate > startDate) * * @example * ```typescript * // From Monday to Friday (same week) * differenceInBusinessDays( * new Date('2024-01-08'), * new Date('2024-01-12') * ) // Returns: 4 * * // Across weekends * differenceInBusinessDays( * new Date('2024-01-05'), // Friday * new Date('2024-01-09') // Tuesday * ) // Returns: 2 (excludes weekend) * ``` */ declare function differenceInBusinessDays(startDate: Date | string | number, endDate: Date | string | number): number; /** * Checks if a date is the last business day of the month * @param date - The date to check * @returns True if it's the last business day of the month * * @example * ```typescript * isLastBusinessDayOfMonth(new Date('2024-01-31')) // true if Jan 31 is a business day * isLastBusinessDayOfMonth(new Date('2024-01-30')) // true if Jan 31 is weekend/holiday * ``` */ declare function isLastBusinessDayOfMonth(date: Date | string | number): boolean; /** * Checks if a date is the first business day of the month * @param date - The date to check * @returns True if it's the first business day of the month * * @example * ```typescript * isFirstBusinessDayOfMonth(new Date('2024-01-01')) // true if Jan 1 is a business day * isFirstBusinessDayOfMonth(new Date('2024-01-02')) // true if Jan 1 is weekend/holiday * ``` */ declare function isFirstBusinessDayOfMonth(date: Date | string | number): boolean; /** * Gets an array of all business days in a given month * @param year - The year * @param month - The month (1-12) * @returns Array of Date objects representing business days * * @example * ```typescript * getBusinessDaysInMonth(2024, 1) * // Returns: Array of Date objects for all business days in January 2024 * ``` */ declare function getBusinessDaysInMonth(year: number, month: number): Date[]; /** * Holiday configuration interface */ interface HolidayRule { name: string; date: string | ((year: number) => Date); type?: 'fixed' | 'floating'; } /** * Checks if a date is a holiday * @param date - The date to check * @param holidaysList - Optional custom list of holidays * @returns True if the date is a holiday */ declare function isHoliday(date: Date | string | number, holidaysList?: (Date | string)[], timezone?: IANATimezone): boolean; /** * Gets holidays for a specific year and country * @param year - The year to get holidays for * @param country - Optional country code (default: 'US') * @returns Array of holiday dates */ declare function getHolidays(year: number, country?: string): Date[]; /** * Adds holiday rules for a country * @param country - The country code * @param rules - Array of holiday rules */ declare function addHolidayRules(country: string, rules: HolidayRule[]): void; /** * Gets the next holiday from a given date * @param date - The starting date * @param country - Optional country code (default: 'US') * @returns The next holiday date */ declare function getNextHoliday(date: Date | string | number, country?: string): Date | null; /** * Adds custom holidays * @param holidayArray - Array of custom holiday dates */ declare function addCustomHolidays(holidayArray: (Date | string | number)[]): void; /** * Custom business day rules interface */ interface BusinessDayRules { workingDays: number[]; holidays: (Date | string)[]; workingHours?: { start: string; end: string; }; } /** * Calculates business days with custom rules * @param start - Start date * @param end - End date * @param rules - Custom business day rules * @returns Number of business days */ declare function calculateBusinessDaysCustom(start: Date | string | number, end: Date | string | number, rules: BusinessDayRules): number; /** * Working hours schedule interface */ interface WorkingSchedule { start: string; end: string; days?: number[]; } /** * Gets working hours between two dates * @param start - Start date/time * @param end - End date/time * @param workingHours - Working hours schedule * @returns Number of working hours */ declare function getWorkingHoursBetween(start: Date | string | number, end: Date | string | number, workingHours: WorkingSchedule): number; /** * Adds working hours to a date * @param date - Starting date * @param hours - Hours to add * @param schedule - Optional working schedule * @returns New date with working hours added */ declare function addWorkingHours(date: Date | string | number, hours: number, schedule?: WorkingSchedule): Date; /** * Checks if a date/time is within working hours * @param date - The date/time to check * @param schedule - Optional working schedule * @returns True if within working hours */ declare function isWorkingHours(date: Date | string | number, schedule?: WorkingSchedule): boolean; /** * Gets the next working hour from a given date * @param date - Starting date * @param schedule - Optional working schedule * @returns Next working hour date */ declare function getNextWorkingHour(date: Date | string | number, schedule?: WorkingSchedule): Date; /** * Merges a date part with a time part * @param datePart - The date component * @param timePart - The time component * @returns New date with merged date and time */ declare function mergeDateTime(datePart: Date | string | number, timePart: Date | string | number): Date; /** * Time of day categories */ type TimeOfDay = 'Night' | 'Morning' | 'Afternoon' | 'Evening'; /** * Gets the time of day category * @param date - The date to categorize * @returns Time of day category */ declare function timeOfDay(date: Date | string | number): TimeOfDay; /** * Gets ISO week number (ISO-8601 standard) * @param date - The date * @returns ISO week number */ declare function getISOWeek(date: Date | string | number): number; /** * Gets the week number within a month * @param date - The date * @returns Week number within the month (1-6) */ declare function getWeekOfMonth(date: Date | string | number): number; /** * Gets fiscal quarter * @param date - The date * @param fiscalYearStart - Fiscal year start month (1-12, default: 1 for January) * @returns Fiscal quarter (1-4) */ declare function getFiscalQuarter(date: Date | string | number, fiscalYearStart?: number): number; /** * Gets fiscal year * @param date - The date * @param fiscalYearStart - Fiscal year start month (1-12, default: 1 for January) * @returns Fiscal year */ declare function getFiscalYear(date: Date | string | number, fiscalYearStart?: number): number; /** * Pay period frequencies */ type PayPeriodFrequency = 'weekly' | 'bi-weekly' | 'semi-monthly' | 'monthly'; /** * Gets pay periods between dates * @param startDate - Start date * @param endDate - End date * @param frequency - Pay period frequency * @returns Array of pay period start dates */ declare function getPayPeriods(startDate: Date | string | number, endDate: Date | string | number, frequency: PayPeriodFrequency): Date[]; /** * Hemispheres for season calculation */ type Hemisphere = 'northern' | 'southern'; /** * Season types */ type Season = 'Spring' | 'Summer' | 'Autumn' | 'Winter'; /** * Gets the season for a date * @param date - The date * @param hemisphere - Northern or southern hemisphere (default: 'northern') * @returns Season name */ declare function getSeason(date: Date | string | number, hemisphere?: Hemisphere): Season; /** * Month name formats */ type MonthNameFormat = 'long' | 'short' | 'narrow'; /** * Gets month name * @param monthNumber - Month number (1-12) * @param locale - Locale string (default: 'en-US') * @param format - Format type (default: 'long') * @returns Month name */ declare function getMonthName(monthNumber: number, locale?: string, format?: MonthNameFormat): string; /** * Gets detailed information about months in a quarter * @param quarter - Quarter number (1-4) * @param year - Year * @returns Object containing quarter info and months */ declare function getMonthsInQuarter(quarter: number, year: number): { quarter: number; year: number; months: { name: string; number: number; firstDay: Date; lastDay: Date; }[]; startDate: Date; endDate: Date; }; /** * Gets the next occurrence of a specific day of week * @param date - Starting date * @param dayOfWeek - Day of week (0=Sunday, 1=Monday, etc.) * @returns Next occurrence date */ declare function nextOccurrence(date: Date | string | number, dayOfWeek: number): Date; /** * Gets the previous occurrence of a specific day of week * @param date - Starting date * @param dayOfWeek - Day of week (0=Sunday, 1=Monday, etc.) * @returns Previous occurrence date */ declare function previousOccurrence(date: Date | string | number, dayOfWeek: number): Date; /** * Converts a date to a different timezone using IANA timezone identifiers * @param date - The date to convert * @param options - Timezone conversion options * @returns Date object in the target timezone * @example * ```javascript * const utcDate = new Date('2025-01-15T12:00:00Z'); * const nyTime = convertTimezone(utcDate, { * from: 'UTC', * to: 'America/New_York' * }); * // Returns: 2025-01-15T07:00:00-05:00 (EST) * ``` */ declare function convertTimezone(date: Date | string | number, options: TimezoneConversionOptions): Date; /** * Parses natural language time expressions into dates * @param expression - Natural language expression * @param options - Parsing options * @returns Parsed date or null if invalid * @example * ```javascript * const tomorrow = parseNaturalLanguage('tomorrow'); * // Returns: Date object for tomorrow at 00:00:00 * * const nextFriday = parseNaturalLanguage('next friday'); * // Returns: Date object for next Friday at 00:00:00 * * const inTwoWeeks = parseNaturalLanguage('in 2 weeks'); * // Returns: Date object 14 days from now * * const threeDaysAgo = parseNaturalLanguage('3 days ago'); * // Returns: Date object 3 days before now * ``` */ declare function parseNaturalLanguage(expression: NaturalTimeExpression, options?: NaturalLanguageOptions): Date | null; /** * Generates recurring dates based on a pattern * @param startDate - Starting date * @param config - Recurring configuration * @returns Array of dates matching the pattern * @example * ```javascript * const weeklyMeetings = generateRecurringDates('2025-01-06', { * pattern: 'weekly', * maxOccurrences: 10 * }); * // Returns: [2025-01-06, 2025-01-13, 2025-01-20, ...] * * const monthlyReports = generateRecurringDates('2025-01-01', { * pattern: 'monthly', * maxOccurrences: 12, * endDate: new Date('2025-12-31') * }); * // Returns: First day of each month for 2025 * ``` */ declare function generateRecurringDates(startDate: Date | string | number, config: RecurringConfig): Date[]; /** * Performs comprehensive date comparison * @param date1 - First date * @param date2 - Second date * @returns Detailed comparison result */ declare function compareDetailed(date1: Date | string | number, date2: Date | string | number): DateComparison; /** * Calculates the duration between two dates with advanced options * @param startDate - Start date * @param endDate - End date * @param options - Display options * @returns Formatted duration string */ declare function calculateAdvancedDuration(startDate: Date | string | number, endDate: Date | string | number, options?: DurationDisplayOptions): string; /** * Gets the nth occurrence of a weekday in a month * @param year - Year * @param month - Month (1-12) * @param dayOfWeek - Day of week (0-6, Sunday is 0) * @param occu