export class YTDate extends Date { constructor(value?: number | string | Date) { if (!value) { super() return } if (typeof value == 'string') { const separator = value.charAt(4) value = value.split(separator).join('-') const ymdRegex = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/; if (!ymdRegex.test(value)) { throw new Error('传入的日期不合法') } } super(value) } /** * 将数字转换为中文周数表示(如:7 → "第七周") * @param weekNum - 周数数字(正整数) * @returns 中文周数字符串 */ static convertToChineseWeek(weekNum: number): string { // 1. 参数校验 if (!Number.isInteger(weekNum) || weekNum <= 0) { throw new Error('输入必须是正整数'); } // 2. 中文数字映射表 const chineseNumbers: string[] = [ '零', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十' ]; // 3. 处理不同范围的数字 let result: string; if (weekNum <= 20) { // 直接使用预定义映射(1-20) result = chineseNumbers[weekNum]; } else if (weekNum <= 99) { // 分解十位和个位(21-99) const tens = Math.floor(weekNum / 10); const units = weekNum % 10; result = chineseNumbers[tens] + '十'; if (units > 0) { result += chineseNumbers[units]; } } else { // 超过99的直接返回数字形式 result = weekNum.toString(); } // 4. 返回带序号的周数 return `第${result}周`; } /** * 根据时间戳获取星期几的中文表示 * @param timestamp - 时间戳(毫秒) * @returns 星期几的中文字符串(如"星期一") */ static getDayOfWeekFromTimestamp(timestamp: number | string | Date): string { // 1. 创建Date对象 const date = new YTDate(timestamp); // 2. 获取星期索引(0-6,0=星期日) const dayIndex = date.getDay(); // 3. 映射到中文星期 const weekdays = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; return weekdays[dayIndex]; } static getWeeks(concatenation: string = '') { return [concatenation + "一", concatenation + "二", concatenation + "三", concatenation + "四", concatenation + "五", concatenation + "六", concatenation + "日"] } /** * 替换日期分隔符 * @param separator - 新的分隔符 * @param targetStr - 目标字符串 * @returns 替换分隔符后的字符串 */ static changeSeparator(separator: string, targetStr: string) { return targetStr.split(targetStr.charAt(4)).join(separator) } /** * 格式化日期 * @param separator - 日期分隔符 * @param date - 日期对象 * @param onlyYMD - 是否只返回年月日 * @returns 格式化后的日期字符串 */ formatDate(separator: string = '-', onlyYMD: boolean = false, date: Date = this): string { if (!(date instanceof Date) || isNaN(date.getTime())) { throw new Error('无效的日期对象'); } const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); if (onlyYMD) { return `${year + separator + month + separator + day}` } return `${year + separator + month + separator + day} ${hours}:${minutes}:${seconds}`; } }