UNPKG

@cloudcome/utils-core

Version:
1 lines 28 kB
{"version":3,"file":"date.mjs","sources":["../src/date/start-end.ts","../src/date/days.ts","../src/date/relative.ts","../src/date/is.ts","../src/date/weeks.ts"],"sourcesContent":["import { type DateLike, type DateValue, dateParse } from './core';\n\n/**\n * 时间单位符号枚举\n * - 'Y': 年\n * - 'M': 月\n * - 'D': 天\n * - 'W': 周\n * - 'h': 小时\n * - 'm': 分钟\n * - 's': 秒\n */\ntype _TDateOfSymbol = 'Y' | 'M' | 'D' | 'W' | 'h' | 'm' | 's';\n\n/**\n * 各时间单位起始时间映射表\n * 包含将日期设置到单位起始时间的函数\n */\nconst dateOfStartMap: [_TDateOfSymbol, (date: DateLike) => unknown][] = [\n ['s', (d) => d.setMilliseconds(0)],\n ['m', (d) => d.setSeconds(0)],\n ['h', (d) => d.setMinutes(0)],\n ['D', (d) => d.setHours(0)],\n ['W', (d) => d.setHours(0)],\n ['M', (d) => d.setDate(1)],\n ['Y', (d) => d.setMonth(0)],\n];\n\n/**\n * 返回指定时间单位的起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param symbol - 时间单位符号,可选值为 'Y'(年)、'M'(月)、'D'(天)、'h'(小时)、'm'(分钟)、's'(秒),默认为 'D'\n * @returns 返回指定时间单位的起始时间\n * @example\n * ```typescript\n * const date = new Date(2023, 5, 15, 12, 30, 45, 500); // 2023-06-15 12:30:45.500\n *\n * // 返回秒级起始时间\n * dateOfStart(date, 's'); // 2023-06-15 12:30:45.000\n *\n * // 返回分钟级起始时间\n * dateOfStart(date, 'm'); // 2023-06-15 12:30:00.000\n *\n * // 返回小时级起始时间\n * dateOfStart(date, 'h'); // 2023-06-15 12:00:00.000\n *\n * // 返回天级起始时间\n * dateOfStart(date, 'D'); // 2023-06-15 00:00:00.000\n *\n * // 返回月级起始时间\n * dateOfStart(date, 'M'); // 2023-06-01 00:00:00.000\n *\n * // 返回年级起始时间\n * dateOfStart(date, 'Y'); // 2023-01-01 00:00:00.000\n *\n * // 默认返回天级起始时间\n * dateOfStart(date); // 2023-06-15 00:00:00.000\n * ```\n */\nfunction _dateStart(dateValue: DateValue, symbol: _TDateOfSymbol = 'D') {\n const date = dateParse(dateValue);\n\n for (const [sym, fn] of dateOfStartMap) {\n fn(date);\n if (symbol === sym) break;\n }\n\n return date;\n}\n\n/**\n * 返回秒级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回秒级起始时间,毫秒部分为 0\n */\nexport function dateStartInSecond(dateValue: DateValue) {\n return _dateStart(dateValue, 's');\n}\n\n/**\n * 返回分钟级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回分钟级起始时间,秒和毫秒部分为 0\n */\nexport function dateStartInMinute(dateValue: DateValue) {\n return _dateStart(dateValue, 'm');\n}\n\n/**\n * 返回小时级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回小时级起始时间,分钟、秒和毫秒部分为 0\n */\nexport function dateStartInHour(dateValue: DateValue) {\n return _dateStart(dateValue, 'h');\n}\n\n/**\n * 返回天级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回天级起始时间,小时、分钟、秒和毫秒部分为 0\n */\nexport function dateStartInDay(dateValue: DateValue) {\n return _dateStart(dateValue, 'D');\n}\n\n/**\n * 返回月级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回月级起始时间,日期为当月第一天,时间部分为 0\n */\nexport function dateStartInMonth(dateValue: DateValue) {\n return _dateStart(dateValue, 'M');\n}\n\n/**\n * 返回年级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回年级起始时间,月份为 1 月,日期为 1 日,时间部分为 0\n */\nexport function dateStartInYear(dateValue: DateValue) {\n return _dateStart(dateValue, 'Y');\n}\n\n/**\n * 各时间单位结束时间映射表\n * 包含将日期设置到单位结束时间的函数\n */\nconst dateOfEndMap: [_TDateOfSymbol, (date: DateLike) => unknown][] = [\n ['s', (d) => d.setMilliseconds(999)],\n ['m', (d) => d.setSeconds(59)],\n ['h', (d) => d.setMinutes(59)],\n ['D', (d) => d.setHours(23)],\n [\n 'M',\n (d) => {\n const d2 = dateParse(d);\n d2.setMonth(d.getMonth() + 1);\n d2.setDate(0);\n d.setDate(d2.getDate());\n },\n ],\n [\n 'Y',\n (d) => {\n d.setMonth(11);\n d.setDate(31);\n },\n ],\n];\n\n/**\n * 返回指定时间单位的结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param symbol - 时间单位符号,可选值为 'Y'(年)、'M'(月)、'D'(天)、'h'(小时)、'm'(分钟)、's'(秒),默认为 'D'\n * @returns 返回指定时间单位的结束时间\n * @example\n * ```typescript\n * const date = new Date(2023, 5, 15, 12, 30, 45, 500); // 2023-06-15 12:30:45.500\n *\n * // 返回秒级结束时间\n * dateOfEnd(date, 's'); // 2023-06-15 12:30:45.999\n *\n * // 返回分钟级结束时间\n * dateOfEnd(date, 'm'); // 2023-06-15 12:30:59.999\n *\n * // 返回小时级结束时间\n * dateOfEnd(date, 'h'); // 2023-06-15 12:59:59.999\n *\n * // 返回天级结束时间\n * dateOfEnd(date, 'D'); // 2023-06-15 23:59:59.999\n *\n * // 返回月级结束时间\n * dateOfEnd(date, 'M'); // 2023-06-30 23:59:59.999\n *\n * // 返回年级结束时间\n * dateOfEnd(date, 'Y'); // 2023-12-31 23:59:59.999\n *\n * // 默认返回天级结束时间\n * dateOfEnd(date); // 2023-06-15 23:59:59.999\n * ```\n */\nfunction _dateEnd(dateValue: DateValue, symbol: _TDateOfSymbol = 'D') {\n const date = dateParse(dateValue);\n\n for (const [sym, fn] of dateOfEndMap) {\n fn(date);\n if (symbol === sym) break;\n }\n\n return date;\n}\n\n/**\n * 返回秒级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回秒级结束时间,毫秒部分为 999\n */\nexport function dateEndInSecond(dateValue: DateValue) {\n return _dateEnd(dateValue, 's');\n}\n\n/**\n * 返回分钟级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回分钟级结束时间,秒为 59,毫秒为 999\n */\nexport function dateEndInMinute(dateValue: DateValue) {\n return _dateEnd(dateValue, 'm');\n}\n\n/**\n * 返回小时级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回小时级结束时间,分钟为 59,秒为 59,毫秒为 999\n */\nexport function dateEndInHour(dateValue: DateValue) {\n return _dateEnd(dateValue, 'h');\n}\n\n/**\n * 返回天级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回天级结束时间,小时为 23,分钟为 59,秒为 59,毫秒为 999\n */\nexport function dateEndInDay(dateValue: DateValue) {\n return _dateEnd(dateValue, 'D');\n}\n\n/**\n * 返回月级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回月级结束时间,日期为当月最后一天,时间为 23:59:59.999\n */\nexport function dateEndInMonth(dateValue: DateValue) {\n return _dateEnd(dateValue, 'M');\n}\n\n/**\n * 返回年级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回年级结束时间,月份为 12 月,日期为 31 日,时间为 23:59:59.999\n */\nexport function dateEndInYear(dateValue: DateValue) {\n return _dateEnd(dateValue, 'Y');\n}\n","import { DATE_DAY_MS } from './const';\nimport { type DateValue, dateParse } from './core';\nimport { dateEndInMonth, dateEndInYear, dateStartInMonth, dateStartInYear } from './start-end';\n\n/**\n * 计算指定日期所在年或月的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param unit - 时间单位符号,可选值为 'Y'(年)、'M'(月),默认为 'M'\n * @returns 返回指定日期所在年或月的天数\n * @example\n * ```typescript\n * dateDays(new Date('2023-02-15')); // 28\n * dateDays(new Date('2024-02-15')); // 29 (闰年)\n * dateDays(new Date('2023-02-15'), 'Y'); // 365\n * dateDays(new Date('2024-02-15'), 'Y'); // 366 (闰年)\n * ```\n */\nfunction _dateDays(dateValue: DateValue, unit: 'Y' | 'M') {\n const d = dateParse(dateValue);\n const ds = unit === 'M' ? dateStartInMonth(d) : dateStartInYear(d);\n const de = unit === 'M' ? dateEndInMonth(d) : dateEndInYear(d);\n return Math.ceil((de.getTime() - ds.getTime()) / DATE_DAY_MS);\n}\n\n/**\n * 计算指定日期所在月份的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回指定日期所在月份的天数\n * @example\n * ```typescript\n * dateDaysInMonth(new Date('2023-02-15')); // 28\n * dateDaysInMonth(new Date('2024-02-15')); // 29 (闰年)\n * ```\n */\nexport function dateDaysInMonth(dateValue: DateValue) {\n return _dateDays(dateValue, 'M');\n}\n\n/**\n * 计算指定日期所在年份的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回指定日期所在年份的天数\n * @example\n * ```typescript\n * dateDaysInYear(new Date('2023-02-15')); // 365\n * dateDaysInYear(new Date('2024-02-15')); // 366 (闰年)\n * ```\n */\nexport function dateDaysInYear(dateValue: DateValue) {\n return _dateDays(dateValue, 'Y');\n}\n","import { stringFormat } from '@/string';\nimport { isArray } from '@/type';\nimport { type DateValue, dateFormat, dateParse } from './core';\n\nexport type DateRelativeTemplate = [\n number /*单位时间差,为 0 表示不计算单位差值,单位秒*/,\n number /*最大时间差,单位:秒*/,\n string /*过去模板字符串,%d 表述单位差值*/,\n string? /*将来模板字符串,%d 表述单位差值,可选*/,\n];\nexport type DateRelativeTemplates = DateRelativeTemplate[];\n\nconst defaultDiffTemplates: DateRelativeTemplates = [\n [0, 10, '刚刚'],\n [1, 60, '{n} 秒前', '{n} 秒后'],\n [60, 60 * 60, '{n} 分钟前', '{n} 分钟后'],\n [60 * 60, 60 * 60 * 24, '{n} 小时前', '{n} 小时后'],\n [0, 60 * 60 * 24 * 2, '昨天', '明天'],\n [0, 60 * 60 * 24 * 3, '前天', '后天'],\n [60 * 60 * 24, 60 * 60 * 24 * 30, '{n} 天前', '{n} 天后'],\n [0, Number.POSITIVE_INFINITY, 'YYYY年MM月DD日'],\n];\n\n/**\n * 相对时间\n * @param {DateValue} dateValue 比较的时间\n * @param {DateValue} [refDateValue] 相对的时间,默认为当前\n * @param {DateRelativeTemplates} [templates] 模板\n * @returns {string} 格式化后的相对时间字符串\n * @example\n * ```typescript\n * // 默认模板\n * dateRelative(new Date('2023-01-01')); // '刚刚'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-02')); // '昨天'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-04')); // '3 天前'\n * dateRelative(new Date('2023-01-01'), new Date('2023-02-01')); // '2023年01月01日'\n * ```\n * @example\n * ```typescript\n * // 自定义模板\n * const templates: DateRelativeTemplates = [\n * [0, 10, '刚刚'],\n * [1, 60, '{n} 秒前', '{n} 秒后'],\n * [60, 60 * 60, '{n} 分钟前', '{n} 分钟后'],\n * [60 * 60, 60 * 60 * 24, '{n} 小时前', '{n} 小时后'],\n * [0, 60 * 60 * 24 * 2, '昨天', '明天'],\n * [0, 60 * 60 * 24 * 3, '前天', '后天'],\n * [60 * 60 * 24, 60 * 60 * 24 * 30, '{n} 天前', '{n} 天后'],\n * [0, Number.POSITIVE_INFINITY, 'YYYY年MM月DD日'],\n * ];\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-02'), templates); // '昨天'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-04'), templates); // '3 天前'\n * dateRelative(new Date('2023-01-01'), new Date('2023-02-01'), templates); // '2023年01月01日'\n * ```\n */\nexport function dateRelative(dateValue: DateValue, refDateValue: DateValue, templates: DateRelativeTemplates): string;\nexport function dateRelative(dateValue: DateValue, refDateValue: DateValue): string;\nexport function dateRelative(dateValue: DateValue, templates: DateRelativeTemplates): string;\nexport function dateRelative(dateValue: DateValue): string;\nexport function dateRelative(\n dateValue: DateValue,\n refDateValue?: DateValue | DateRelativeTemplates,\n templates?: DateRelativeTemplates,\n): string {\n const now = Date.now();\n const refDateValueFinal = isArray(refDateValue) ? now : refDateValue || now;\n const templatesFinal = isArray(templates) ? templates : isArray(refDateValue) ? refDateValue : defaultDiffTemplates;\n const d1 = dateParse(dateValue);\n const d2 = dateParse(refDateValueFinal);\n const diff = d1.getTime() - d2.getTime();\n const isAgo = diff < 0;\n const absDiff = Math.abs(diff);\n let relative = '';\n\n for (const [base, max, agoTemplate, featureTemplate] of templatesFinal) {\n const unitFinal = base * 1000;\n const maxFinal = max * 1000;\n\n if (absDiff < maxFinal) {\n const template = isAgo ? agoTemplate : featureTemplate || agoTemplate;\n const length = unitFinal === 0 ? 0 : Math.max(Math.floor(absDiff / unitFinal), 1);\n relative = unitFinal === 0 ? dateFormat(dateValue, template) : stringFormat(template, { n: length });\n break;\n }\n }\n\n return relative;\n}\n","import { type DateLike, type DateValue, dateParse } from './core';\n\n/**\n * 判断给定的年份是否为闰年\n * @param year - 需要判断的年份\n * @returns 如果年份是闰年则返回 true,否则返回 false\n * @example\n * ```typescript\n * isLeapYear(2020); // true\n * isLeapYear(2021); // false\n * isLeapYear(2000); // true\n * isLeapYear(1900); // false\n * ```\n */\nexport function isLeapYear(year: number): boolean {\n if (year % 4 !== 0) return false;\n if (year % 100 !== 0) return true;\n if (year % 400 !== 0) return false;\n return true;\n}\n\n/**\n * 日期比较精度枚举类型\n * - Y = 年\n * - M = 月\n * - D = 天\n * - h = 小时\n * - m = 分钟\n * - s = 秒\n * - S = 毫秒\n */\ntype _DateSameSymbol = 'Y' | 'M' | 'D' | 'h' | 'm' | 's' | 'S';\n\n/**\n * 比较两个日期在指定精度下是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @param sameSymbol - 比较精度,默认为 'D'(天,即年月日天都相同)\n * @returns 如果两个日期在指定精度下相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30, 45, 500);\n * const date2 = new Date(2023, 5, 15, 13, 30, 45, 500);\n *\n * // 比较年份\n * isSameDate(date1, date2, 'Y'); // true\n *\n * // 比较月份(年份也要相同)\n * isSameDate(date1, date2, 'M'); // true\n *\n * // 比较日期(默认,年份、月份也要相同)\n * isSameDate(date1, date2); // true\n *\n * // 比较小时(年、月、日也要相同)\n * isSameDate(date1, date2, 'h'); // false\n *\n * // 比较分钟(年、月、日、小时也要相同)\n * isSameDate(date1, date2, 'm'); // false\n *\n * // 比较秒(年、月、日、小时、分钟也要相同)\n * isSameDate(date1, date2, 's'); // false\n *\n * // 比较毫秒(年、月、日、小时、分钟、秒数也要相同)\n * isSameDate(date1, date2, 'S'); // false\n * ```\n */\nfunction _isSameDateIn(date1: DateValue, date2: DateValue, sameSymbol: _DateSameSymbol = 'D') {\n const defines = [\n ['Y', (d: DateLike) => d.getFullYear()],\n ['M', (d: DateLike) => d.getMonth()],\n ['D', (d: DateLike) => d.getDate()],\n ['h', (d: DateLike) => d.getHours()],\n ['m', (d: DateLike) => d.getMinutes()],\n ['s', (d: DateLike) => d.getSeconds()],\n ['S', (d: DateLike) => d.getMilliseconds()],\n ] as const;\n\n const d1 = dateParse(date1);\n const d2 = dateParse(date2);\n\n for (const [sym, fn] of defines) {\n if (fn(d1) !== fn(d2)) {\n return false;\n }\n\n if (sym === sameSymbol) break;\n }\n\n return true;\n}\n\n/**\n * 比较两个日期的年份是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 6, 20);\n * isSameDateInYear(date1, date2); // true\n * ```\n */\nexport function isSameDateInYear(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'Y');\n}\n\n/**\n * 比较两个日期的年份和月份是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份和月份相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 5, 20);\n * isSameDateInMonth(date1, date2); // true\n * ```\n */\nexport function isSameDateInMonth(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'M');\n}\n\n/**\n * 比较两个日期的年份、月份和天数是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份和天数相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 5, 15);\n * isSameDateInDay(date1, date2); // true\n * ```\n */\nexport function isSameDateInDay(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'D');\n}\n\n/**\n * 比较两个日期的年份、月份、天数和小时是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数和小时相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12);\n * const date2 = new Date(2023, 5, 15, 12);\n * isSameDateInHour(date1, date2); // true\n * ```\n */\nexport function isSameDateInHour(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'h');\n}\n\n/**\n * 比较两个日期的年份、月份、天数、小时和分钟是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数、小时和分钟相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30);\n * const date2 = new Date(2023, 5, 15, 12, 30);\n * isSameDateInMinute(date1, date2); // true\n * ```\n */\nexport function isSameDateInMinute(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'm');\n}\n\n/**\n * 比较两个日期的年份、月份、天数、小时、分钟和秒数是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数、小时、分钟和秒数相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30, 45);\n * const date2 = new Date(2023, 5, 15, 12, 30, 45);\n * isSameDateInSecond(date1, date2); // true\n * ```\n */\nexport function isSameDateInSecond(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 's');\n}\n","import { DATE_DAY_MS } from './const';\nimport { type DateValue, dateParse } from './core';\n\nexport enum EWeekStart {\n /**\n * 周日作为一周的起始日\n */\n sunday = 0,\n /**\n * 周一作为一周的起始日\n */\n monday = 1,\n /**\n * 周二作为一周的起始日\n */\n tuesday = 2,\n /**\n * 周三作为一周的起始日\n */\n wednesday = 3,\n /**\n * 周四作为一周的起始日\n */\n thursday = 4,\n /**\n * 周五作为一周的起始日\n */\n friday = 5,\n /**\n * 周六作为一周的起始日\n */\n saturday = 6,\n // /**\n // * 1号所在的周为第一周\n // */\n // firstDate = 7,\n // /**\n // * 完整7天表示第一周\n // */\n // firstFullWeek = 8,\n}\n\n/**\n * 计算指定日期所在年份或月份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param type - 计算范围,'Y' 表示年份,'M' 表示月份\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在年份或月份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * _dateWeeks(date, 'Y'); // 1 (计算年份的周数)\n * _dateWeeks(date, 'M'); // 1 (计算月份的周数)\n * _dateWeeks(date, 'Y', 1); // 1 (周一作为一周的起始日,计算年份的周数)\n * ```\n */\nexport function _dateWeeks(dateValue: DateValue, type: 'Y' | 'M', weekStart: EWeekStart = 0) {\n const date = dateParse(dateValue);\n\n const year = date.getFullYear();\n const month = date.getMonth();\n\n const firstDate = type === 'Y' ? new Date(year, 0, 1) : new Date(year, month, 1);\n const firstWeek = firstDate.getDay();\n const days = Math.ceil((date.getTime() - firstDate.getTime()) / DATE_DAY_MS);\n\n return Math.ceil((firstWeek + days - weekStart) / 7);\n}\n\n/**\n * 计算指定日期所在年份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在年份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * weeksOfYear(date); // 1\n * weeksOfYear(date, 1); // 1 (周一作为一周的起始日)\n * ```\n */\nexport function weeksOfYear(dateValue: DateValue, weekStart: EWeekStart = 0) {\n return _dateWeeks(dateValue, 'Y', weekStart);\n}\n\n/**\n * 计算指定日期所在月份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在月份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * weeksOfMonth(date); // 1\n * weeksOfMonth(date, 1); // 1 (周一作为一周的起始日)\n * ```\n */\nexport function weeksOfMonth(dateValue: DateValue, weekStart: EWeekStart = 0) {\n return _dateWeeks(dateValue, 'M', weekStart);\n}\n"],"names":["d","d2","EWeekStart"],"mappings":"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"}